Skip to content

Command / Query Pattern (1-to-1) ​

Use send() to dispatch a Request (Command or Query) to exactly one Handler.

Quick Start ​

1. Scaffold your Logic ​

Stop writing boilerplate. Generate a Request, Handler, and Action in one command:

bash
php artisan make:mediator-handler RegisterUserHandler --action

2. Implementation Example ​

Below is a complete example of how to implement a user registration flow using the Mediator pattern.

php
namespace App\Http\Handlers\RegisterUser;

use Illuminate\Foundation\Http\FormRequest;

class RegisterUserRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'email' => 'required|email',
            'password' => 'required|min:8'
        ];
    }
}
php
namespace App\Http\Handlers\RegisterUser;

use App\Models\User;
// Use #[CommandHandler] for commands that mutate state:
use Ignaciocastro0713\CqbusMediator\Attributes\Handlers\CommandHandler;
// Or #[QueryHandler] for read-only queries:
// use Ignaciocastro0713\CqbusMediator\Attributes\Handlers\QueryHandler;
// Or the generic #[RequestHandler] if you prefer:
// use Ignaciocastro0713\CqbusMediator\Attributes\Handlers\RequestHandler;

#[CommandHandler(RegisterUserRequest::class)]
class RegisterUserHandler
{
    public function handle(RegisterUserRequest $request): User
    {
        // Your business logic goes here
        return User::create($request->validated());
    }
}
php
namespace App\Http\Actions;

use App\Http\Handlers\RegisterUser\RegisterUserRequest;
use Ignaciocastro0713\CqbusMediator\Attributes\Routing\Api;
use Ignaciocastro0713\CqbusMediator\Contracts\Mediator;
use Ignaciocastro0713\CqbusMediator\Traits\AsAction;
use Illuminate\Routing\Router;

#[Api]
class RegisterUserAction
{
    use AsAction;

    public function __construct(private readonly Mediator $mediator) {}

    public static function route(Router $router): void
    {
        $router->post('/register');
    }

    public function handle(RegisterUserRequest $request)
    {
        // Executes the handler and returns the User
        $user = $this->mediator->send($request);

        return response()->json($user);
    }
}

Using the Facade ​

If you prefer not to use Dependency Injection, you can use the Mediator facade to dispatch requests. This can help keep your Action classes cleaner by removing the constructor:

php
use Ignaciocastro0713\CqbusMediator\Facades\Mediator;

// ...

    public function handle(RegisterUserRequest $request)
    {
        // Dispatches via Facade
        $user = Mediator::send($request);

        return response()->json($user);
    }