nicwortel / command-pipeline
A command pipeline for PHP
v0.4.0
2021-03-28 13:15 UTC
Requires
- php: ^7.4 || ^8.0
- beberlei/assert: ^2.1 || ^3.0
- doctrine/doctrine-bundle: ^1.11 || ^2.0
- doctrine/orm: ^2.6.3
- psr/log: ^1.1
- simple-bus/message-bus: ^6.0
- simple-bus/symfony-bridge: ^6.0
- symfony/config: ^4.0 || ^5.0
- symfony/dependency-injection: ^4.0 || ^5.0
- symfony/http-kernel: ^4.0 || ^5.0
- symfony/security-bundle: ^4.0 || ^5.0
- symfony/security-core: ^4.3 || ^5.0
- symfony/validator: ^4.4.4 || ^5.0.4
Requires (Dev)
- doctrine/annotations: ^1.7
- liip/rmt: ^1.6
- mockery/mockery: ^1.2.3
- nicwortel/coding-standard: ^2.0
- phpstan/phpstan: ^0.12.7
- phpunit/phpunit: ^9.4
- symfony/framework-bundle: ^4.0 || ^5.0
Conflicts
- doctrine/common: <2.12
- doctrine/doctrine-cache-bundle: <1.3.1
README
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.
Features
- Command validation
- Command authorization
- Wrapping command handling in a Doctrine database transaction
- Dispatching emitted domain events to an event bus
Installation
composer require nicwortel/command-pipeline
If you are using Symfony, enable the CommandPipelineBundle:
// config/bundles.php return [ // ... NicWortel\CommandPipeline\Bundle\CommandPipelineBundle::class => ['all' => true], ];
Usage
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); // ... } }