PHPackages                             andydefer/laravel-comments - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. andydefer/laravel-comments

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

andydefer/laravel-comments
==========================

Laravel package providing polymorphic comments with Repository pattern, DTOs, Enums, Status management, and Value Objects.

v1.0.0(today)00MITPHPPHP ^8.2

Since Jun 19Pushed todayCompare

[ Source](https://github.com/andydefer/laravel-comments)[ Packagist](https://packagist.org/packages/andydefer/laravel-comments)[ RSS](/packages/andydefer-laravel-comments/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (13)Versions (2)Used By (0)

Laravel Comments
================

[](#laravel-comments)

> Système de commentaires polymorphiques pour applications Laravel

Un package Laravel complet pour gérer des commentaires polymorphiques avec le pattern Repository, des DTOs, des Value Objects, une modération intégrée et un système de réponses.

---

📋 Table des matières
--------------------

[](#-table-des-matières)

- [Fonctionnalités](#fonctionnalit%C3%A9s)
- [Prérequis](#pr%C3%A9requis)
- [Installation](#installation)
- [Configuration](#configuration)
- [Utilisation](#utilisation)
    - [Ajouter un commentaire](#ajouter-un-commentaire)
    - [Ajouter une réponse](#ajouter-une-r%C3%A9ponse)
    - [Récupérer des commentaires](#r%C3%A9cup%C3%A9rer-des-commentaires)
    - [Mettre à jour un commentaire](#mettre-%C3%A0-jour-un-commentaire)
    - [Supprimer un commentaire](#supprimer-un-commentaire)
    - [Modération des commentaires](#mod%C3%A9ration-des-commentaires)
    - [Compter les commentaires](#compter-les-commentaires)
- [Référence de l'API](#r%C3%A9f%C3%A9rence-de-lapi)
- [Statuts des commentaires](#statuts-des-commentaires)
- [Value Objects](#value-objects)
- [Structure de la base de données](#structure-de-la-base-de-donn%C3%A9es)
- [Tests](#tests)
- [Journal des modifications](#journal-des-modifications)
- [Contribuer](#contribuer)
- [Licence](#licence)

---

✨ Fonctionnalités
-----------------

[](#-fonctionnalités)

- ✅ **Double polymorphisme** - Commentez n'importe quel modèle avec n'importe quel auteur
- ✅ **Système de réponses** - Commentaires imbriqués avec support des threads
- ✅ **Modération intégrée** - Statuts : Publié, Masqué, Signalé
- ✅ **Pattern Repository** - Séparation propre de la logique d'accès aux données
- ✅ **Support des DTOs** - Objets de transfert de données typés
- ✅ **Value Objects** - DateTime, Métadonnées
- ✅ **Support des métadonnées** - Stockez des données supplémentaires au format JSON
- ✅ **Suppression douce** - Suppression sécurisée avec possibilité de restauration
- ✅ **Filtrage avancé** - Filtrez par auteur, objet, parent, statut
- ✅ **Tests complets** - Couverture complète des tests d'intégration

---

🚀 Prérequis
-----------

[](#-prérequis)

- PHP 8.2 ou supérieur
- Laravel 12.0, 13.0, 14.0 ou 15.0

---

📦 Installation
--------------

[](#-installation)

Installez le package via Composer :

```
composer require andydefer/laravel-comments
```

### Publier les migrations

[](#publier-les-migrations)

```
php artisan vendor:publish --tag=Comments-migrations
```

### Exécuter les migrations

[](#exécuter-les-migrations)

```
php artisan migrate
```

---

⚙️ Configuration
----------------

[](#️-configuration)

Le package est automatiquement découvert par Laravel. Aucune configuration supplémentaire n'est requise.

Si vous devez personnaliser le Service Provider, ajoutez-le manuellement dans `config/app.php` :

```
'providers' => [
    // ...
    AndyDefer\LaravelComments\CommentsServiceProvider::class,
],
```

---

📖 Utilisation
-------------

[](#-utilisation)

### Ajouter un commentaire

[](#ajouter-un-commentaire)

```
use AndyDefer\LaravelComments\Services\CommentService;

class PostController extends Controller
{
    public function store(CommentService $commentService)
    {
        $user = auth()->user();
        $post = Post::find(1);

        // Ajouter un commentaire
        $comment = $commentService->add(
            commenter: $user,      // Qui commente
            commentable: $post,    // Quoi est commenté
            content: 'Super article !'
        );

        return $comment;
    }
}
```

### Ajouter une réponse

[](#ajouter-une-réponse)

```
// Ajouter une réponse à un commentaire existant
$reply = $commentService->add(
    commenter: $user,
    commentable: $post,
    content: 'Merci pour ce retour !',
    parentId: $comment->id  // ID du commentaire parent
);
```

### Récupérer des commentaires

[](#récupérer-des-commentaires)

#### Tous les commentaires d'un modèle

[](#tous-les-commentaires-dun-modèle)

```
// Récupère uniquement les commentaires publiés par défaut
$comments = $commentService->get($post);

// Récupère tous les commentaires (incluant masqués et signalés)
$allComments = $commentService->get($post, false);
```

#### Réponses d'un commentaire

[](#réponses-dun-commentaire)

```
$replies = $commentService->getReplies($commentId);
```

#### Commentaires d'un auteur

[](#commentaires-dun-auteur)

```
$userComments = $commentService->getByCommenter($user);
```

#### Trouver un commentaire par ID

[](#trouver-un-commentaire-par-id)

```
$comment = $commentService->find($commentId);
```

### Mettre à jour un commentaire

[](#mettre-à-jour-un-commentaire)

```
$updated = $commentService->update($commentId, 'Nouveau contenu modifié');
```

### Supprimer un commentaire

[](#supprimer-un-commentaire)

```
$commentService->delete($commentId);
```

### Modération des commentaires

[](#modération-des-commentaires)

#### Masquer un commentaire

[](#masquer-un-commentaire)

```
$hidden = $commentService->hide($commentId);
// Le statut passe à 'hidden'
```

#### Publier un commentaire

[](#publier-un-commentaire)

```
$published = $commentService->publish($commentId);
// Le statut passe à 'published'
```

#### Signaler un commentaire

[](#signaler-un-commentaire)

```
$flagged = $commentService->flag($commentId);
// Le statut passe à 'flagged'
```

### Compter les commentaires

[](#compter-les-commentaires)

```
// Compter les commentaires publiés d'un modèle
$count = $commentService->count($post);

// Compter tous les commentaires (incluant masqués et signalés)
$total = $commentService->count($post, false);

// Compter les commentaires signalés
$flaggedCount = $commentService->countFlagged();

// Compter les commentaires masqués
$hiddenCount = $commentService->countHidden();

// Compter les commentaires publiés
$publishedCount = $commentService->countPublished();
```

---

📚 Référence de l'API
--------------------

[](#-référence-de-lapi)

### CommentService

[](#commentservice)

MéthodeDescriptionRetourne`add(Model $commenter, Model $commentable, string $content, ?int $parentId = null)`Créer un commentaire`Model``update(int $commentId, string $content)`Mettre à jour le contenu`Model``delete(int $commentId)`Supprimer un commentaire`void``hide(int $commentId)`Masquer un commentaire`Model``publish(int $commentId)`Publier un commentaire`Model``flag(int $commentId)`Signaler un commentaire`Model``get(Model $commentable, bool $onlyPublished = true)`Récupérer les commentaires`Collection``getReplies(int $parentId, bool $onlyPublished = true)`Récupérer les réponses`Collection``getByCommenter(Model $commenter)`Récupérer par auteur`Collection``find(int $commentId)`Trouver par ID`?Model``count(Model $commentable, bool $onlyPublished = true)`Compter les commentaires`int``countFlagged()`Compter les signalés`int``countHidden()`Compter les masqués`int``countPublished()`Compter les publiés`int`---

🏷️ Statuts des commentaires
---------------------------

[](#️-statuts-des-commentaires)

StatutValeurDescriptionMéthode associée`PUBLISHED``'published'`Commentaire visible`publish()``HIDDEN``'hidden'`Commentaire masqué`hide()``FLAGGED``'flagged'`Commentaire signalé`flag()`### Méthodes du statut

[](#méthodes-du-statut)

```
use AndyDefer\LaravelComments\Enums\CommentStatus;

$status = CommentStatus::PUBLISHED;

$status->getLabel();    // 'Publié'
$status->isPublished(); // true
$status->isHidden();    // false
$status->isFlagged();   // false
```

---

🎯 Value Objects
---------------

[](#-value-objects)

Le package supporte les Value Objects suivants :

Value ObjectDescriptionExemple`DateTimeVO`Date/heure`DateTimeVO::from('2024-01-01 12:00:00')``StrictDataObject`Métadonnées typées`StrictDataObject::from(['key' => 'value'])`### Accesseurs dans le modèle Comment

[](#accesseurs-dans-le-modèle-comment)

```
$comment = Comment::find(1);

// Accès sous forme de Value Objects
$createdAt = $comment->getCreatedAt();    // DateTimeVO
$updatedAt = $comment->getUpdatedAt();    // DateTimeVO
$metadata = $comment->getMetadata();      // StrictDataObject

// Relations
$commenter = $comment->commenter;    // Auteur (User, Admin, etc.)
$commentable = $comment->commentable; // Objet commenté (Post, Article, etc.)
$parent = $comment->parent;           // Commentaire parent
$replies = $comment->replies;         // Réponses (HasMany)
```

---

📝 Structure de la base de données
---------------------------------

[](#-structure-de-la-base-de-données)

```
CREATE TABLE comments (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    commenter_type VARCHAR(255) NOT NULL,   -- Type de l'auteur
    commenter_id BIGINT UNSIGNED NOT NULL,  -- ID de l'auteur
    commentable_type VARCHAR(255) NOT NULL, -- Type de l'objet commenté
    commentable_id BIGINT UNSIGNED NOT NULL,-- ID de l'objet commenté
    content TEXT NOT NULL,                  -- Contenu du commentaire
    parent_id BIGINT UNSIGNED NULL,         -- Commentaire parent (réponses)
    status VARCHAR(20) DEFAULT 'published', -- Statut du commentaire
    metadata JSON NULL,                     -- Métadonnées
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL,
    deleted_at TIMESTAMP NULL,

    INDEX idx_commenter (commenter_type, commenter_id),
    INDEX idx_commentable (commentable_type, commentable_id),
    INDEX idx_parent (parent_id),
    INDEX idx_status (status)
);
```

---

🔍 Exemple complet
-----------------

[](#-exemple-complet)

```
use AndyDefer\LaravelComments\Services\CommentService;
use AndyDefer\LaravelComments\Enums\CommentStatus;

class CommentController extends Controller
{
    public function __construct(
        private readonly CommentService $commentService
    ) {}

    public function store(Request $request, Post $post)
    {
        $comment = $this->commentService->add(
            commenter: $request->user(),
            commentable: $post,
            content: $request->input('content')
        );

        return response()->json($comment, 201);
    }

    public function index(Post $post)
    {
        $comments = $this->commentService->get($post);

        return response()->json($comments);
    }

    public function reply(Request $request, Post $post, Comment $parent)
    {
        $reply = $this->commentService->add(
            commenter: $request->user(),
            commentable: $post,
            content: $request->input('content'),
            parentId: $parent->id
        );

        return response()->json($reply, 201);
    }

    public function moderate(Comment $comment, string $action)
    {
        $result = match($action) {
            'hide' => $this->commentService->hide($comment->id),
            'flag' => $this->commentService->flag($comment->id),
            'publish' => $this->commentService->publish($comment->id),
            'delete' => $this->commentService->delete($comment->id),
            default => throw new \InvalidArgumentException('Invalid action')
        };

        return response()->json(['success' => true, 'comment' => $result]);
    }

    public function stats(Post $post)
    {
        return response()->json([
            'total' => $this->commentService->count($post, false),
            'published' => $this->commentService->count($post, true),
            'flagged' => $this->commentService->countFlagged(),
            'hidden' => $this->commentService->countHidden(),
        ]);
    }
}
```

---

🧪 Tests
-------

[](#-tests)

### Exécuter les tests

[](#exécuter-les-tests)

```
composer test
```

### Exécuter uniquement les tests unitaires

[](#exécuter-uniquement-les-tests-unitaires)

```
composer test-unit
```

### Exécuter uniquement les tests d'intégration

[](#exécuter-uniquement-les-tests-dintégration)

```
composer test-integration
```

### Configuration des tests

[](#configuration-des-tests)

Le package utilise `orchestra/testbench` pour les tests d'intégration avec une base de données SQLite en mémoire.

---

🔧 Développement
---------------

[](#-développement)

### Style de code

[](#style-de-code)

```
./vendor/bin/pint
```

### Analyse statique

[](#analyse-statique)

```
./vendor/bin/phpstan analyse
./vendor/bin/psalm
```

---

📄 Journal des modifications
---------------------------

[](#-journal-des-modifications)

Veuillez consulter le [CHANGELOG](CHANGELOG.md) pour plus d'informations sur les modifications récentes.

---

🤝 Contribuer
------------

[](#-contribuer)

Veuillez consulter [CONTRIBUTING](CONTRIBUTING.md) pour plus de détails.

### Flux de développement

[](#flux-de-développement)

1. Forkez le dépôt
2. Créez une branche de fonctionnalité (`git checkout -b feature/amazing-feature`)
3. Apportez vos modifications
4. Exécutez les tests (`composer test`)
5. Committez vos modifications (`git commit -m 'Ajouter une fonctionnalité géniale'`)
6. Poussez vers la branche (`git push origin feature/amazing-feature`)
7. Ouvrez une Pull Request

---

📦 Dépendances
-------------

[](#-dépendances)

- [`andydefer/php-vo`](https://github.com/andydefer/php-vo) - Value Objects
- [`andydefer/laravel-repository`](https://github.com/andydefer/laravel-repository) - Implémentation du pattern Repository
- [`andydefer/domain-structures`](https://github.com/andydefer/domain-structures) - Structures de domaine (AbstractRecord, AbstractData)

---

👨‍💻 Auteur
----------

[](#‍-auteur)

**Andy Kani**

- GitHub: [@andydefer](https://github.com/andydefer)
- Email:

---

⭐ Support
---------

[](#-support)

Si vous trouvez ce package utile, n'hésitez pas à lui donner une ⭐ sur GitHub !

---

🙏 Remerciements
---------------

[](#-remerciements)

- Framework Laravel
- Tous les contributeurs et utilisateurs de ce package

---

**Construit avec ❤️ pour la communauté Laravel**

###  Health Score

39

—

LowBetter than 85% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/2170ec3fbad9eb4b002661ab4f58b1cc374eae4293b92904c6a74bc2818bd570?d=identicon)[andydefer](/maintainers/andydefer)

---

Top Contributors

[![andydefer](https://avatars.githubusercontent.com/u/124321745?v=4)](https://github.com/andydefer "andydefer (1 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/andydefer-laravel-comments/health.svg)

```
[![Health](https://phpackages.com/badges/andydefer-laravel-comments/health.svg)](https://phpackages.com/packages/andydefer-laravel-comments)
```

###  Alternatives

[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17818.7k](/packages/markwalet-nova-modal-response)[crumbls/layup

A visual page builder plugin for Filament 5 — Divi-style grid layouts with extensible widgets.

591.7k1](/packages/crumbls-layup)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.2k](/packages/tomshaw-electricgrid)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
