Метод 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,
который помечает класс как обработчик сообщений