Reusable polymorphic reporting for Laravel models with Livewire.
corepine/reportable gives you a small reporting foundation that you can reuse across reviews, comments, posts, and any other Eloquent model. It ships with:
- polymorphic
reporterandreportablerelations HasReportsandCanReportmodel concerns- config and enum backed report types and statuses
- a report manager/service for creating and resolving reports
- Livewire components for report modal and report inbox with encrypted parameters
- starter Blade components and routes
composer require corepine/reportable
php artisan reportable:install --migrateAdd HasReports to models that may be reported:
use Corepine\Reportable\Models\Concerns\HasReports;
class Post extends Model
{
use HasReports;
}Add CanReport to the actor model:
use Corepine\Reportable\Models\Concerns\CanReport;
class User extends Authenticatable
{
use CanReport;
}The package includes a Livewire-powered report modal that automatically encrypts the reportable type and ID for security:
{{-- Place the modal component once in your layout --}}
<x-corepine-report-modal />
{{-- Use the button component to trigger the modal --}}
<x-corepine-report-button :reportable="$post" label="Report Post" />The button component automatically:
- Encrypts the model type and ID using Laravel's Crypt facade
- Dispatches a Livewire event to open the modal
- Passes encrypted parameters securely
You can also trigger the modal manually using JavaScript:
@php
use Illuminate\Support\Facades\Crypt;
$encryptedType = Crypt::encryptString($post->getMorphClass());
$encryptedId = Crypt::encryptString((string) $post->getKey());
@endphp
<button
wire:click="$dispatch('openReportModal', {
encryptedType: '{{ $encryptedType }}',
encryptedId: '{{ $encryptedId }}'
})"
>
Report
</button>
{{-- Include modal component --}}
<x-corepine-report-modal />use Corepine\Reportable\Support\ReportableEncryption;
// Encrypt reportable model
$encrypted = ReportableEncryption::encryptReportable($post);
// Returns: ['encryptedType' => '...', 'encryptedId' => '...']
// Decrypt parameters
$decrypted = ReportableEncryption::decryptReportable($encryptedType, $encryptedId);
// Returns: ['type' => 'App\Models\Post', 'id' => '123']The reports index page uses Livewire for real-time filtering and pagination:
{{-- In your layout --}}
@livewire('corepine-reports-index')Or use the included page route:
/corepine/reportable/reports
The Livewire modal automatically closes after a successful report submission and flashes a success message to the session.
$user->report($post, 'obscene', [
'message' => 'This content is inappropriate'
]);