Aller au contenu

Commentaires

ArtisanCMS intègre un système de commentaires complet pour les articles de blog. Il comprend la soumission publique, un workflow de modération, des mesures anti-spam et une invalidation automatique du cache.

Le modèle Comment (App\Models\Comment) est associé aux articles :

ChampTypeDescription
post_idintegerArticle commenté
user_idintegerUtilisateur connecté (nullable)
author_namestringNom de l’auteur (visiteurs)
author_emailstringEmail de l’auteur (visiteurs)
contenttextContenu du commentaire
statusstringStatut de modération
ip_addressstringAdresse IP du visiteur
user_agentstringUser-Agent du navigateur
parent_idintegerCommentaire parent (réponses)
created_atdatetimeDate de publication

Le Front\PublicCommentController gère la soumission de commentaires par les visiteurs :

Route::post('/comments', [PublicCommentController::class, 'store']);

Pour les visiteurs non connectés :

  • Nom : obligatoire
  • Email : obligatoire, validé mais non affiché publiquement
  • Contenu : obligatoire, longueur minimale configurable

Pour les utilisateurs connectés, le nom et l’email sont remplis automatiquement depuis leur profil.

ArtisanCMS met en place plusieurs couches de protection contre le spam :

MesureDescription
HoneypotChamp caché invisible pour les humains, détecté par les bots
Rate limitingLimite le nombre de commentaires par IP et par période
Validation du contenuDétection de patterns de spam courants
Temps minimumTemps minimal entre l’affichage du formulaire et la soumission

Chaque commentaire passe par un workflow d’approbation :

StatutDescription
pendingEn attente de modération (statut par défaut)
approvedApprouvé et visible publiquement
rejectedRejeté, non affiché sur le site

Le comportement par défaut est configurable dans les paramètres du site :

// Paramètres de commentaires
'comments' => [
'moderation' => true, // Modération activée par défaut
'auto_approve_registered' => false, // Auto-approuver les utilisateurs enregistrés
'notify_admin' => true, // Notifier l'admin par email
'min_content_length' => 10, // Longueur minimale du contenu
],

Le Admin\CommentController fournit l’interface de modération :

Route::resource('comments', CommentController::class)->except(['create', 'store']);
Route::post('comments/{comment}/approve', [CommentController::class, 'approve']);
Route::post('comments/{comment}/reject', [CommentController::class, 'reject']);
Route::post('comments/bulk-action', [CommentController::class, 'bulkAction']);
  • Approuver : rendre le commentaire visible
  • Rejeter : masquer le commentaire
  • Supprimer : suppression définitive
  • Action groupée : approuver, rejeter ou supprimer plusieurs commentaires simultanément

L’interface d’administration affiche :

  • La liste des commentaires avec filtrage par statut
  • Un aperçu rapide du contenu et de l’article associé
  • Des indicateurs visuels pour les commentaires en attente
  • Un compteur de commentaires en attente dans la barre latérale

Le CommentService centralise la logique métier :

class CommentService
{
public function store(array $data): Comment;
public function approve(Comment $comment): void;
public function reject(Comment $comment): void;
public function getCommentsForPost(Post $post): Collection;
public function getPendingCount(): int;
}

Les visiteurs peuvent répondre à un commentaire existant, créant une structure de conversation imbriquée :

Commentaire de Jean
├── Réponse de Marie
│ └── Réponse de Jean
└── Réponse de Pierre

L’imbrication est gérée via le champ parent_id sur le modèle Comment.

Le CommentObserver invalide automatiquement le cache lorsqu’un commentaire est créé, modifié ou supprimé :

class CommentObserver
{
public function saved(Comment $comment): void
{
Cache::tags(["post:{$comment->post_id}"])->flush();
}
}

Cela garantit que les visiteurs voient toujours les commentaires à jour sans délai.

Les commentaires peuvent etre activés ou désactivés individuellement sur chaque article via le champ comment_status du modèle Post. Consultez la section Articles de blog pour plus de détails.