В рамках 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 создает новый экземпляр, чтобы обработать команду, что обеспечивает чистоту выполнения и избегает смешивания состояний между различными командами и обработчиками команд.