Projectslaravel-actionsActions

Laravel Actions

Package

Synchronously dispatched action classes for Laravel.

Upgrade Guide

Actions

Creating an action

Extend BradieTilley\Actions\Action (recommended), or implement Actionable and use the Dispatchable trait:

use BradieTilley\Actions\Action;

class AssignDefaultRole extends Action
{
    public function __construct(public readonly User $user) {}

    public function handle(): void
    {
        if ($this->user->role) {
            return;
        }

        $this->user->update(['role' => Role::DEFAULT]);
    }
}
use BradieTilley\Actions\Concerns\Dispatchable;
use BradieTilley\Actions\Contracts\Actionable;

class AssignDefaultRole implements Actionable
{
    use Dispatchable;

    public function __construct(public readonly User $user) {}

    public function middleware(): array
    {
        return [];
    }

    public function handle(): void
    {
        //
    }
}

The Actionable interface does not declare handle() so you can type-hint dependencies on handle() for container injection.

Dispatching

AssignDefaultRole::dispatch($user);

use BradieTilley\Actions\Facades\Action;

Action::dispatch(new AssignDefaultRole($user));

Conditional dispatch

AssignDefaultRole::dispatchIf($user->role === null, $user);
AssignDefaultRole::dispatchUnless($user->hasRole(), $user);

Both return null when the action is not run.

Replacing actions

Swap one action class for another (useful in tests or multi-tenant apps):

use BradieTilley\Actions\Facades\Action;

Action::replace([
    AssignDefaultRole::class => AssignAlternativeDefaultRole::class,
]);

AssignDefaultRole::dispatch($user); // runs AssignAlternativeDefaultRole

Continue to Middleware.