1. Go to this page and download the library: Download thecorps/laravel-cqrs library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
thecorps / laravel-cqrs example snippets
use TheCorps\LaravelCqrs\Contracts\Interfaces\Commands\CommandInterface;
use TheCorps\LaravelCqrs\Contracts\Attributes\Commands\CommandHandler;
#[CommandHandler(CreateUserCommandHandler::class)]
final class CreateUserCommand implements CommandInterface
{
public function __construct(
public readonly string $name,
public readonly string $email,
) {}
}
use TheCorps\LaravelCqrs\Contracts\Interfaces\Commands\CommandHandlerInterface;
class CreateUserCommandHandler implements CommandHandlerInterface
{
public function handle(CreateUserCommand $command): User
{
return User::create([
'name' => $command->name,
'email' => $command->email,
]);
}
}
use TheCorps\LaravelCqrs\Contracts\Interfaces\Queries\QueryInterface;
use TheCorps\LaravelCqrs\Contracts\Attributes\Queries\QueryHandler;
#[QueryHandler(GetUserQueryHandler::class)]
final class GetUserQuery implements QueryInterface
{
public function __construct(
public readonly int $userId,
) {}
}
use TheCorps\LaravelCqrs\Contracts\Interfaces\Queries\QueryHandlerInterface;
class GetUserQueryHandler implements QueryHandlerInterface
{
public function handle(GetUserQuery $query): ?User
{
return User::find($query->userId);
}
}
use TheCorps\LaravelCqrs\Facades\QueryBus;
$user = QueryBus::dispatch(new GetUserQuery(userId: $id));
#[CommandHandler(CreateUserCommandHandler::class)]
#[CommandValidator(CreateUserCommandValidator::class)]
final class CreateUserCommand implements CommandInterface { ... }
use TheCorps\LaravelCqrs\Contracts\Interfaces\Commands\ValidatesCommandInterface;
class CreateUserCommandValidator implements ValidatesCommandInterface
{
public function validate(object $command): void
{
if (User::where('email', $command->email)->exists()) {
throw ValidationException::withMessages([
'email' => 'This email is already registered.',
]);
}
}
}
class TransferFundsCommandHandler implements CommandHandlerInterface
{
public function handle(TransferFundsCommand $command): void
{
// Both writes run inside the same DB transaction.
// If the second one throws, the first is rolled back automatically.
Account::find($command->fromId)->decrement('balance', $command->amount);
Account::find($command->toId)->increment('balance', $command->amount);
}
}
'command_pipeline' => [
LoggingBehavior::class,
ValidationBehavior::class,
TransactionBehavior::class,
HandlerExecutionBehavior::class, // must always be last
],
'query_pipeline' => [
ValidationBehavior::class,
HandlerExecutionBehavior::class, // must always be last
],
use Closure;
use TheCorps\LaravelCqrs\Contracts\Interfaces\Pipeline\PipelineBehaviorInterface;
class RateLimitingBehavior implements PipelineBehaviorInterface
{
public function __construct(private readonly RateLimiter $limiter) {}
public function handle(object $command, Closure $next): mixed
{
// your cross-cutting logic here
return $next($command);
}
}