itmedia / command-bus-bundle
Command bus
Installs: 2 582
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 1
Forks: 1
Open Issues: 0
Type:symfony-bundle
Requires
- php: ^7.4 || ^8.0
- symfony/framework-bundle: ^3.0 || ^4.0 || ^5.0
Requires (Dev)
- phpunit/phpunit: ^6.0 || ^7.0
This package is auto-updated.
Last update: 2025-05-13 23:29:15 UTC
README
Install
composer require itmedia/command-bus-bundle
CommandBus
Пример регистрации сервиса, также смотри ниже добавление встроеных обработчиков комманд (Middleware):
services: app.command_bus: class: Itmedia\CommandBusBundle\CommandBus\CommandBus arguments: ["@itmedia_command_bus.container_handler_mapper"]
Middleware
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
Команда должна иметь интерфейс 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; } }