composer require itmedia/command-bus-bundle Пример регистрации сервиса, также смотри ниже добавление встроеных обработчиков комманд (Middleware):
services:
app.command_bus:
class: Itmedia\CommandBusBundle\CommandBus\CommandBus
arguments: ["@itmedia_command_bus.container_handler_mapper"]Middleware реализуют дополнительную обработку сообщений, например: валидацию, проверку прав доступа, логирование.
Middleware должны реализовывать интерфейс MiddlewareInterface. В CommandBus при выполнении сообщения
происходит его обработка подключенными Middleware. При не выполнении правил, должно всегда выбрасываться исключение.
Пример конфигурации:
services:
app.command_bus:
class: Itmedia\CommandBusBundle\CommandBus\CommandBus
arguments: ["@itmedia_command_bus.container_handler_mapper"]
calls:
- [addMiddleware, ["@itmedia_command_bus.middleware_validation"]]
- [addMiddleware, ["@app.middleware_access_control"]]
# custom middleware
app.middleware_access_control:
class: AppBundle\Middleware\AccessControlMiddlewareКоманда должна иметь интерфейс Command.
use Itmedia\CommandBusBundle\Command\Command;
class TestCommand implements Command
{
//...
public function commandName(): string
{
return 'test_command';
}
}Handlers могут иметь произвольную структуру, если используется, либо для единичного handler - CommandHandler
Пример конфигурации CommandHandler:
services:
# по умолчанию будет вызван метод execute()
AppBundle\Handler\MyHandler:
public: true
tags:
- {name: command_handler, command: core_register_user }
# явное указание методов
AppBundle\Handler\NyHandler2:
public: true
tags:
- {name: command_handler, command: core_register_user1, method: methodName1 }
- {name: command_handler, command: core_register_user2, method: methodName2 }
- {name: command_handler, command: core_register_user3, method: methodName3 }Пример использования:
$command = new CommandTest();
$this->get('app.command_bus')->handle($command);Для валидации команд средствами symfony/validator необходимо подключить ValidationMiddleware для CommandBus:
services:
Itmedia\CommandBusBundle\CommandBus\CommandBus:
arguments: ["@itmedia_command_bus.container_handler_mapper"]
calls:
- [addMiddleware, ["@itmedia_command_bus.middleware_validation"]]Пример правил валидации команды:
use Itmedia\CommandBusBundle\Command\Command;
use Symfony\Component\Validator\Constraints as Assert;
class TestCommand implements Command
{
/**
* @NotBlank()
*/
private string $username;
/**
* @NotBlank()
* @Assert\Email()
*/
private string $email;
public function __construct(string $username, string $email)
{
$this->username = $username;
$this->email = $email;
}
public function commandName(): string
{
return 'test_command';
}
public function getUsername(): string
{
return $this->username;
}
public function getEmail(): string
{
return $this->email;
}
}Если комманда не проходит валидацию выбрасывается исключение ValidationException
HandlePropertiesFormArrayTrait - вспомогательный трейт для устаовки значений по ключу из массива
в свойства команды. Название ключа должно соответсвовать названию свойства.
use Itmedia\CommandBusBundle\Command\Command;
use Itmedia\CommandBusBundle\Command\HandlePropertiesFormArrayTrait;
class TestCommand implements Command
{
use HandlePropertiesFormArrayTrait;
// ....
public function __construct($id, array $data)
{
$this->handleProperties($data);
$this->id = $id;
}
} 
