corepine / reportable
Reusable polymorphic reporting for Laravel models with a starter Blade UI.
Requires
- php: ^8.2|^8.3|^8.4
- laravel/framework: ^11.0|^12.0|^13.0
- livewire/livewire: ^3.0
Requires (Dev)
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^2.34|^3.0
- pestphp/pest-plugin-laravel: ^2.4|^3.0
This package is not auto-updated.
Last update: 2026-03-19 10:44:38 UTC
README
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
Installation
composer require corepine/reportable php artisan reportable:install --migrate
Quick Start
Add 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; }
Using Livewire Components
Report Modal with Encrypted Parameters
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
Manual Usage with Encrypted Parameters
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 />
Using the Encryption Helper
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']
Reports Index with Livewire
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
Modal Auto-Close
The Livewire modal automatically closes after a successful report submission and flashes a success message to the session.
Create a report in code:
$user->report($post, 'obscene', [ 'message' => 'This content is inappropriate' ]);