РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1342 of 1361 menu

Метод handle класса HandleTrait

Метод handle трейта HandleTrait отправляет сообщение в шину сообщений и возвращает результат, который вернул обработчик этого сообщения. Первым параметром передаётся объект сообщения. Метод использует свойство $messageBus, в которое нужно предварительно записать шину. Если обработчик вернул значение, оно будет возвращено из метода handle. Если обработчиков несколько, то вернётся результат последнего из них.

Синтаксис

handle(object $message): mixed

Пример

Давайте создадим класс сервиса, который использует трейт HandleTrait и отправляет сообщение в шину:

<?php namespace AppService; use SymfonyComponentMessengerHandleTrait; use SymfonyComponentMessengerMessageBusInterface; class MessageService { use HandleTrait; public function __construct(MessageBusInterface $messageBus) { $this->messageBus = $messageBus; } public function send(string $text): mixed { return $this->handle(new SendMessage($text)); } } ?>

Теперь создадим само сообщение:

<?php namespace AppMessage; class SendMessage { public function __construct( public string $text, ) { } } ?>

И обработчик, который вернёт результат:

<?php namespace AppMessageHandler; use AppMessageSendMessage; use SymfonyComponentMessengerAttributeAsMessageHandler; #[AsMessageHandler] class SendMessageHandler { public function __invoke(SendMessage $message): string { return 'handled: ' . $message->text; } } ?>

Вызовем метод send сервиса:

<?php namespace AppController; use AppServiceMessageService; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class MessageController extends AbstractController { #[Route('/message', name: 'message_send')] public function send(MessageService $service): Response { $res = $service->send('abcde'); return new Response($res); } } ?>

Результат выполнения кода:

handled: abcde

Пример

Давайте посмотрим, как метод handle возвращает массив из обработчика:

<?php namespace AppMessageHandler; use AppMessageListMessage; use SymfonyComponentMessengerAttributeAsMessageHandler; #[AsMessageHandler] class ListMessageHandler { public function __invoke(ListMessage $message): array { return ['article 1', 'article 2', 'article 3']; } } ?>

И вызовем его через метод handle:

<?php namespace AppController; use AppMessageListMessage; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationJsonResponse; use SymfonyComponentMessengerHandleTrait; use SymfonyComponentMessengerMessageBusInterface; use SymfonyComponentRoutingAttributeRoute; class MessageController extends AbstractController { use HandleTrait; public function __construct(MessageBusInterface $messageBus) { $this->messageBus = $messageBus; } #[Route('/list', name: 'message_list')] public function list(): JsonResponse { $res = $this->handle(new ListMessage()); return new JsonResponse($res); } } ?>

Результат выполнения кода:

["article 1", "article 2", "article 3"]

Смотрите также

  • трейт HandleTrait,
    который добавляет метод handle в класс
  • метод dispatch,
    который отправляет сообщение в шину
  • класс MessageBus,
    который управляет обработкой сообщений
  • атрибут AsMessageHandler,
    который помечает класс как обработчик сообщений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить