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.