Skip to content

by25/CommandBusBundle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

615a217 · Sep 13, 2021

History

26 Commits
Sep 13, 2021
Sep 13, 2021
Sep 13, 2021
Sep 13, 2021
Sep 13, 2021
Sep 13, 2021
Feb 8, 2017
Sep 13, 2021
Feb 8, 2017
Feb 8, 2017
Sep 13, 2021
Sep 13, 2021
Feb 8, 2017

Repository files navigation

CommandBusBundle

Scrutinizer Code Quality Build Status

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

}