An in-memory Command Pipeline implementation for PHP. A command pipeline handles cross-cutting concerns in a CQRS application that works with command objects, such as validation of commands, authorization, logging, etc.
Commands are processed in a linear process. The return value of each stage is passed to the next. A stage can only prevent the next stage from being executed by throwing an exception.
The concept of the command pipeline is loosely based on the Pipes and Filters pattern.
- Command validation
- Command authorization
- Wrapping command handling in a Doctrine database transaction
- Dispatching emitted domain events to an event bus
composer require nicwortel/command-pipeline
If you are using Symfony, enable the CommandPipelineBundle:
// config/bundles.php
return [
// ...
NicWortel\CommandPipeline\Bundle\CommandPipelineBundle::class => ['all' => true],
];
Fetch the command_pipeline
service from the service container or (recommended) inject the CommandPipeline
into your
application code:
<?php
declare(strict_types=1);
use NicWortel\CommandPipeline\CommandPipeline;
// ...
class MyController
{
private CommandPipeline $commandPipeline;
public function __construct(CommandPipeline $commandPipeline)
{
$this->commandPipeline = $commandPipeline;
}
public function saveAction(): Response
{
$command = new MyCommand();
$command->foo = 'bar';
$this->commandPipeline->process($command);
// ...
}
}