karabinse/laravel-commentable

Easily add a commentable trait to a Eloquent model

1.0.1 2024-10-31 12:23 UTC

This package is auto-updated.

Last update: 2024-10-31 12:26:43 UTC


README

Latest Version on Packagist

Easily add a commentable trait to an Eloquent model

use Karabin\Commentable\Concerns\Commentable;

class Product extends Model
{
    use Commentable;

    protected $guarded = ['location'];

Installation

You can install the package via composer:

composer require karabinse/laravel-commentable

You can publish and run the migrations with:

php artisan vendor:publish --tag="laravel-commentable-migrations"
php artisan migrate

You can publish the config file with:

php artisan vendor:publish --tag="laravel-commentable-config"

This is the contents of the published config file:

return [
    'models' => [
        'comment' => \Karabin\Commentable\Models\Comment::class,
    ],

    // Add models that have comments here
    'model_map' => [
    ],

    'data' => [
        'comment' => \Karabin\Commentable\Data\CommentData::class,
    ],
];

Optionally, you can publish the views using

php artisan vendor:publish --tag="laravel-commentable-views"

Usage

Add the trait to the model you want to add comments to.

class Customer extends Model
{
    use Commentable, HasFactory;

Configure the model map. You can also provide a data transformer for the comment itself.

use App\Data\CommentData;
use App\Models\Customer;
use App\Models\Product;

return [
    'models' => [
        'comment' => \Karabin\Commentable\Models\Comment::class,
    ],

    // Add models that have comments here
    'model_map' => [
        'customers' => Customer::class,
        'products' => Product::class,
    ],

    'data' => [
        'comment' => CommentData::class,
    ],
];

Saving a new comment:

use Karabin\Commentable\Models\Comment;

$commentModel = new Comment;
$comment = $commentModel->storeComment(
    commenter: $request->user(),
    modelName: $modelName,
    modelId: $modelId,
    comment: $request->comment,
    parentId: $request->parent_id ?? null
);

return CommentData::from($comment)->wrap('data');

Getting comments:

$commentModel = new Comment;
$comments = $commentModel->getCommentsForModel($modelName, $modelId);

return response()->json(['data' => $comments]);

Testing

composer test

Credits

License

The MIT License (MIT). Please see License File for more information.