Installation
Laractions is a library, not a scaffold. There is no config file to publish, nothing to register in a service provider and no base class of yours to change. One Composer command and you can write the first action.
composer require edulazaro/laractions
EduLazaro\Laractions\LaractionsServiceProvider is auto discovered. It registers the two Artisan commands and declares the tracing migration as publishable. That is the whole footprint.
Requirements
| PHP | 8.2 or newer |
| Laravel | 11 or newer |
Nothing else. The package leans on the framework you already have: the container resolves actions, the validator checks their arguments, the queue runs them.
Where actions live
Actions go in app/Actions, and model scoped actions in app/Actions/{Model}. That is where make:action writes them and where list:actions looks, but nothing enforces it: an action is an ordinary class, so it can live anywhere PSR-4 can reach. If you move them somewhere else, list:actions stops finding them, which is the only thing you lose.
Tracing
Tracing is the one feature with a database table behind it, and it is opt in twice over: the migration is not loaded automatically, and tracing has to be switched on per call with trace(). If you never call it, you never need the table.
php artisan vendor:publish --tag=laractions-migrations php artisan migrate
That creates action_traces: nullable morphs for the actor and the target, the action class name, and a JSON column with the resolved parameters. See Actors and tracing for what gets written and when.
Queues
Running an action inline needs no setup. Dispatching one needs the queue you would set up for any Laravel job: a connection in config/queue.php and a worker consuming it.
php artisan queue:work --queue=default,emails
One detail worth knowing before you test anything asynchronous. With QUEUE_CONNECTION=sync, which is still the default in a fresh .env, dispatch() runs the action immediately in the same process. Everything works, but nothing is deferred, and a failure surfaces as an exception at the call site rather than as a failed job. It is a common source of "the delay is being ignored": a sync connection has nowhere to put a delay.