A Laravel package to add comments to any model
- 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
CommentableInterfacecontract and add theCommentabletrait.
<?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
CanCommentInterfacecontract and theCanCommenttrait to the model that is going to add the comment (usually theUserModel). 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;
// ...
}- Use the
addCommentmethod to add an anonymous comment
$blogPost = BlogPost::first();
$comment = $blogPost->addComment('my comment');- Use the
addCommentFrommethod to add a comment from a User (or the model that implements theCanCommentInterfacecontract)
$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
CanCommentInterfacecontract) by using thecommentmethod.
$user = User::first();
$blogPost = BlogPost::first();
$comment = $user->comment($blogPost, 'my comment');-
The
Commentmethod is another commentable instance, meaning you can use theaddCommentoraddCommentFrommethod to add a reply. -
You can also use the
replyandreplyFrommethods 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
addCommentFrommethod to add a comment from the User (or the model that implements theCanCommentInterfacecontract)
$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
CanCommentInterfacecontract) by using thecommentmethod.
$user = User::first();
$blogPost = BlogPost::first();
$comment = $user->comment($blogPost, 'my comment');- You can get all the user comments with the
commentsmethod
$comments = User::first()->comments();- You can get all the comments associated with the commentable model with the
commentsmethod
$comments = BlogPost::first()->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();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']);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();The Comment model fires the following events that you can listen:
- CommentCreated
- CommentCreating
- CommentUpdated
- CommentUpdating
- CommentDeleted
- CommentDeleting
- CommentSaved
- CommentSaving
composer analysecomposer refactorcomposer formatcomposer testIf you discover a security vulnerability within this package, please write trough the https://alfonsobries.com contact form. All security vulnerabilities will be promptly addressed.
This project exists thanks to all the people who contribute.