Skip to content

Repository files navigation

CommandBusBundle

Scrutinizer Code QualityBuild Status

Install

composer require itmedia/command-bus-bundle 

CommandBus

Пример регистрации сервиса, также смотри ниже добавление встроеных обработчиков комманд (Middleware):

services:
app.command_bus:
class: Itmedia\CommandBusBundle\CommandBus\CommandBusarguments: ["@itmedia_command_bus.container_handler_mapper"]

Middleware

Middleware реализуют дополнительную обработку сообщений, например: валидацию, проверку прав доступа, логирование. Middleware должны реализовывать интерфейс MiddlewareInterface. В CommandBus при выполнении сообщения происходит его обработка подключенными Middleware. При не выполнении правил, должно всегда выбрасываться исключение.

Пример конфигурации:

services:
app.command_bus:
class: Itmedia\CommandBusBundle\CommandBus\CommandBusarguments: ["@itmedia_command_bus.container_handler_mapper"]calls:
- [addMiddleware, ["@itmedia_command_bus.middleware_validation"]]
- [addMiddleware, ["@app.middleware_access_control"]] # custom middlewareapp.middleware_access_control:
class: AppBundle\Middleware\AccessControlMiddleware

Command

Команда должна иметь интерфейс Command.

useItmedia\CommandBusBundle\Command\Command;
class TestCommand implements Command
{
//...publicfunctioncommandName(): string
{
return'test_command';
}
}

Handlers могут иметь произвольную структуру, если используется, либо для единичного handler - CommandHandler

Пример конфигурации CommandHandler:

services:
# по умолчанию будет вызван метод execute()AppBundle\Handler\MyHandler:
public: truetags:
- {name: command_handler, command: core_register_user } # явное указание методовAppBundle\Handler\NyHandler2:
public: truetags:
- {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 = newCommandTest();
$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"]]

Пример правил валидации команды:

useItmedia\CommandBusBundle\Command\Command;
useSymfony\Component\Validator\ConstraintsasAssert;
class TestCommand implements Command
{
/** * @NotBlank() */privatestring$username;
/** * @NotBlank() * @Assert\Email() */privatestring$email;
publicfunction__construct(string$username, string$email)
{
$this->username = $username;
$this->email = $email;
}
publicfunctioncommandName(): string
{
return'test_command';
}
publicfunctiongetUsername(): string
{
return$this->username;
}
publicfunctiongetEmail(): string
{
return$this->email;
}
}

Если комманда не проходит валидацию выбрасывается исключение ValidationException

Установка значений свойств комманды из массива

HandlePropertiesFormArrayTrait - вспомогательный трейт для устаовки значений по ключу из массива в свойства команды. Название ключа должно соответсвовать названию свойства.

useItmedia\CommandBusBundle\Command\Command;
useItmedia\CommandBusBundle\Command\HandlePropertiesFormArrayTrait;
class TestCommand implements Command
{
use HandlePropertiesFormArrayTrait;
// ....publicfunction__construct($id, array$data)
{
$this->handleProperties($data);
$this->id = $id;
}
} 

About

Реализация CommandBus

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages