victorlap/laravel-approvable
Add approval workflows to any Laravel model with victorlap/laravel-approvable. Submit, approve, or reject records via a simple trait, with configurable approvers, status tracking, and query scopes—ideal for content moderation, publishing pipelines, and multi-step sign-offs.
php@^7.2 and laravel/framework@^5.8|^6.0. If you are on PHP 7.1 or Laravel ≤ 5.7, composer require will simply refuse to resolve — stay on a pre-1.2 tag or upgrade the host app first. Laravel 6.x is the safer long-term target (LTS) if you are planning the jump anyway.composer require <vendor>/<package>. Laravel 5.5+ packages normally ship extra.laravel.providers / aliases, so no manual registration is needed. Check the package's composer.json for that block first; only touch config/app.php if it is absent.php artisan vendor:publish --provider="Vendor\Package\ServiceProvider" (add --tag=config / --tag=migrations to be selective). Read the published config top-to-bottom once — it is usually the fastest map of what the package can actually do.new. Type-hint the package's contract/class in controllers, jobs, and commands. This is what makes the package swappable and fakeable; hard-coding new PackageClient() in a controller is the most common thing that makes a codebase hard to test later.config/, secrets in .env. Published config files should reference env('PACKAGE_KEY') values, not literals. Never edit files under vendor/ — a composer update will silently discard the change.DB::transaction(). This gives you retries and keeps request latency predictable.RefreshDatabase. Bind a fake implementation in the test container ($this->app->instance(...) or $this->mock(...)), and use Bus::fake() / Http::fake() so tests do not hit live services.composer why-not <vendor>/<package> 1.2.0 — it tells you exactly which dependency is holding PHP or Laravel back. Do not "fix" it with --ignore-platform-reqs; you will get runtime fatals instead of a clean error.config/app.php, you get duplicate bindings and confusing "already registered" behavior. Remove the manual entry.php artisan config:cache must be re-run (or config:clear locally). A stale cached config is the classic "my .env change did nothing" bug.php artisan migrate --force in the deploy pipeline and make sure rollbacks are safe before you rely on them. Check whether the package's migrations are idempotent — re-publishing can otherwise produce duplicates.composer.lock. Because 1.2.0 only relaxes/advances platform requirements, the patch-level diff is low risk, but a ^5.8|^6.0 range means an unattended composer update can move you across the 5.8 → 6.0 boundary. Review Laravel's own upgrade guide for that jump separately.@internal classes as off-limits — they are the first thing to break in a minor release.How can I help you explore Laravel packages today?