Вызвать commandBus один раз?

В рамках Symfony Framework commandBus представляет собой шаблон проектирования, используемый для обработки команд (команды - это объекты, содержащие информацию о том, какое действие должно быть выполнено). В Symfony используется концепция "одноразового вызова" (one-time call) commandBus, что означает, что каждый запрос на выполнение команды требует создания нового экземпляра commandBus. Ниже я подробно объясню этот процесс.

Symfony по умолчанию использует библиотеку "SimpleBus", которая предоставляет реализацию шаблона commandBus. Чтобы вызвать commandBus, необходимо выполнить следующие шаги:

1. Определить команду:
Команда - это класс, реализующий интерфейс SimpleBusMessageHandlerMessage из библиотеки SimpleBus. Класс команды должен содержать информацию, необходимую для выполнения требуемого действия. Например:

   namespace AppCommand;

   class CreateUserCommand implements SimpleBusMessageHandlerMessage
   {
       private $username;
       private $password;

       public function __construct(string $username, string $password)
       {
           $this->username = $username;
           $this->password = $password;
       }

       public function getUsername(): string
       {
           return $this->username;
       }

       public function getPassword(): string
       {
           return $this->password;
       }
   }

2. Создать обработчик команды:
Обработчик команды - это класс, который содержит логику выполнения требуемого действия на основе информации, предоставленной командой. Например:

   namespace AppHandler;

   use AppCommandCreateUserCommand;

   class CreateUserHandler
   {
       public function handle(CreateUserCommand $command)
       {
           // Логика создания пользователя
       }
   }

3. Зарегистрировать обработчик команды:
Обработчик команды должен быть зарегистрирован в Symfony контейнере зависимостей (DI container) для автоматической инъекции зависимостей во время выполнения команды. Например, можно зарегистрировать обработчик команды в файле services.yaml:

   services:
       AppHandlerCreateUserHandler:
           tags:
               - { name: message_handler, handles: AppCommandCreateUserCommand }

4. Вызвать commandBus:
Чтобы вызвать commandBus, необходимо создать экземпляр класса SimpleBusMessageBusMessageBusSupportingMiddleware. Это можно сделать например в контроллере:

   namespace AppController;

   use SymfonyBundleFrameworkBundleControllerAbstractController;
   use SymfonyComponentHttpFoundationResponse;
   use SymfonyComponentRoutingAnnotationRoute;
   use SimpleBusMessageBusMessageBusSupportingMiddleware;
   use AppCommandCreateUserCommand;

   class UserController extends AbstractController
   {
       /**
        * @Route("/user", name="create_user")
        */
       public function createUser(MessageBusSupportingMiddleware $commandBus): Response
       {
           $command = new CreateUserCommand('example_user', 'password');
           $commandBus->handle($command);

           // Дополнительные действия, например редирект или ответ

           return $this->redirectToRoute('home');
       }
   }

В данном примере, мы создаем экземпляр CreateUserCommand и передаем его в метод handle объекта $commandBus. CommandBus обрабатывает команду с использованием зарегистрированных обработчиков команды. Таким образом, обработчик CreateUserHandler будет вызываться, чтобы выполнить логику создания пользователя.

Такое использование commandBus позволяет обеспечить модульность и повторное использование кода, разделяя логику на отдельные команды и их обработчики. Каждый вызов commandBus создает новый экземпляр, чтобы обработать команду, что обеспечивает чистоту выполнения и избегает смешивания состояний между различными командами и обработчиками команд.