alfonsobries / laravel-commentable
A Laravel package to add comments to any model
Requires
- php: ^8.0
- laravel/framework: ^9.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.11
- orchestra/testbench: ^7.9
- pestphp/pest: ^1.22
- phpstan/phpstan: ^1.8
- rector/rector: ^0.14.5
README
A Laravel package to add comments to any model
Use
Installation
- Install the composer package:
composer require alfonsobries/laravel-commentable
- Publish the database migration
php artisan vendor:publish --provider="Alfonsobries\LaravelCommentable\LaravelCommentableServiceProvider" --tag="migrations"
- Optionally publish the config file
php artisan vendor:publish --provider="Alfonsobries\LaravelCommentable\LaravelCommentableServiceProvider" --tag="config"
- Configure the model that is going to receive the comments with the
CommentableInterface
contract and add theCommentable
trait.
<?php namespace App\Models; use Alfonsobries\LaravelCommentable\Contracts\CommentableInterface; use Alfonsobries\LaravelCommentable\Traits\Commentable; use Illuminate\Database\Eloquent\Model; class BlogPost extends Model implements CommentableInterface { use Commentable; // ... }
- Add the
CanCommentInterface
contract and theCanComment
trait to the model that is going to add the comment (usually theUser
Model). Since you can add anonymous comments this is only necessary if you want to accept User comments.
<?php namespace App\Models; use Alfonsobries\LaravelCommentable\Contracts\CanCommentInterface; use Alfonsobries\LaravelCommentable\Traits\CanComment; use Illuminate\Database\Eloquent\Model; class User extends Model implements CanCommentInterface { use CanComment; // ... }
Add comments
- Use the
addComment
method to add an anonymous comment
$blogPost = BlogPost::first(); $comment = $blogPost->addComment('my comment');
- Use the
addCommentFrom
method to add a comment from a User (or the model that implements theCanCommentInterface
contract)
$user = User::first(); $blogPost = BlogPost::first(); $comment = $blogPost->addCommentFrom($user, 'my comment');
- You can also comment with the User model (or the model that implements the
CanCommentInterface
contract) by using thecomment
method.
$user = User::first(); $blogPost = BlogPost::first(); $comment = $user->comment($blogPost, 'my comment');
Add replies to comments
-
The
Comment
method is another commentable instance, meaning you can use theaddComment
oraddCommentFrom
method to add a reply. -
You can also use the
reply
andreplyFrom
methods that are just an alias for the comment methods above.
$user = User::create([...]); $user2 = User::create([...]); $blogPost = BlogPost::first(); $comment = $blogPost->commentFrom($user, 'my comment'); $comment->replyFrom($user2, 'a reply');
- Use the
addCommentFrom
method to add a comment from the User (or the model that implements theCanCommentInterface
contract)
$user = User::first(); $blogPost = BlogPost::first(); $comment = $blogPost->addCommentFrom($user, 'my comment');
- You can also comment with the User model (or the model that implements the
CanCommentInterface
contract) by using thecomment
method.
$user = User::first(); $blogPost = BlogPost::first(); $comment = $user->comment($blogPost, 'my comment');
Get comments
- You can get all the user comments with the
comments
method
$comments = User::first()->comments();
- You can get all the comments associated with the commentable model with the
comments
method
$comments = BlogPost::first()->comments();
Sort comments
Sort the comments by popularity (average positive likes) by using the popular
and unpopular
scope methods.
$popularComments = BlogPost::first()->comments()->popular()->get(); $unpopularComments = BlogPost::first()->comments()->unpopular()->get();
Update comments
Since the Comment
object is just a regular Eloquent Model you can use any of the different ways to update the models.
$comment->update(['comment' => 'updated comment']);
Approving comments
By default, all the new comments are unapproved (approved_at=null
), meaning that you need to approve them manually based on your specific needs (you can add an event listener based on the the events listed below to do that). If you don't need to handle approved and unapproved comments, you can simply ignore the filter when querying the comments.
$comment->approve(); $comment->unapprove();
You can filter the approved or not approved comments with the approved
and notApproved
methods.
$model->comments()->approved()->get(); $model->comments()->notApproved()->get();
Events
The Comment
model fires the following events that you can listen:
- CommentCreated
- CommentCreating
- CommentUpdated
- CommentUpdating
- CommentDeleted
- CommentDeleting
- CommentSaved
- CommentSaving
Development
Analyze the code with phpstan
composer analyse
Refactor the code with php rector
composer refactor
Format the code with php-cs-fixer
composer format
Run tests
composer test
Security
If you discover a security vulnerability within this package, please write trough the https://alfonsobries.com contact form. All security vulnerabilities will be promptly addressed.
Credits
This project exists thanks to all the people who contribute.