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;
}
}