rezaghz/laravel-reports
Add reporting to Eloquent models (spam, violence, abuse, drugs, etc.). Mark a User as reporter and any model as reportable via traits/contracts. Simple API to report, remove, or toggle reports, with publishable migrations. Supports Laravel 6–12, PHP 8.2+.

Laravel reports package for implementing reports (eg: Spam,Violence,Child Abuse,illegal Drugs, etc.) on Eloquent models.
Download package into the project using Composer.
$ composer require rezaghz/laravel-reports
Laravel 5.5 (or higher) uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
For Laravel 5.4 or earlier releases version include the service provider within app/config/app.php:
'providers' => [
Rezaghz\Laravel\Reports\ReportsServiceProvider::class,
],
If you want to make changes in migrations, publish them to your application first.
$ php artisan vendor:publish --provider="Rezaghz\Laravel\Reports\ReportsServiceProvider" --tag=laravel-reports-migrations
Run database migrations.
$ php artisan migrate
Use Rezaghz\Laravel\Reports\Contracts\ReportsInterface contract in model which will perform report behavior on
reportable model and implement it and use Rezaghz\Laravel\Reports\Traits\Reports trait.
use Rezaghz\Laravel\Reports\Traits\Reports;
use Rezaghz\Laravel\Reports\Contracts\ReportsInterface;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements ReportsInterface
{
use Reports;
}
Use Rezaghz\Laravel\Reports\Contracts\ReportableInterface contract in model which will get report behavior and
implement it and use Rezaghz\Laravel\Reports\Traits\Reportable trait.
use Illuminate\Database\Eloquent\Model;
use Rezaghz\Laravel\Reports\Traits\Reportable;
use Rezaghz\Laravel\Reports\Contracts\ReportableInterface;
class Article extends Model implements ReportableInterface
{
use Reportable;
}
$user->reportTo($article, 'spam');
$article->report('spam'); // current login user
$article->report('spam', $user);
Removing report of user from reportable model.
$user->removeReportFrom($article);
$article->removeReport(); // current login user
$article->removeReport($user);
The toggle report method will add a report to the model if the user has not reported. If a user has already reported, then it will replace the previous report with a new report. For example, if the user has reported 'spam' on the model. Now on toggles report to 'violence' then it will remove the 'spam' and stores the 'violence' report.
If a user has reported spam then on toggle report with spam. It will remove the report.
$user->toggleReportOn($article, 'spam');
$article->toggleReport('spam'); // current login user
$article->toggleReport('spam', $user);
$user->isReportedOn($article));
$article->is_reported; // current login user
$article->isReportBy(); // current login user
$article->isReportBy($user);
$article->reportSummary();
$article->report_summary;
// example
$article->report_summary->toArray();
// output
/*
[
"spam" => 5,
"violence" => 2,
"illegal_drugs" => 4,
"child_abuse" => 1
]
*/
$article->reportsBy();
Find all articles reported by user.
Article::whereReportedBy()->get(); // current login user
Article::whereReportedBy($user)->get();
Article::whereReportedBy($user->id)->get();
// It will return the Report object that is reported by given user.
$article->reported($user);
$article->reported(); // current login user
$article->reported; // current login user
$user->reportedOn($article);
On each report added \Rezaghz\Laravel\Reports\Events\OnReport event is fired.
On each report removed \Rezaghz\Laravel\Reports\Events\OnDeleteReport event is fired.
Run the tests with:
$ composer test
Or run PHPUnit directly:
$ vendor/bin/phpunit
How can I help you explore Laravel packages today?