Метод dispatch класса MessageBus
Метод dispatch класса MessageBus
отправляет сообщение в шину сообщений.
Первым параметром передаётся объект сообщения,
который нужно обработать. Вторым параметром
можно передать массив штампов StampInterface,
добавляющих к сообщению дополнительные данные.
Метод возвращает объект Envelope
с результатами обработки.
Синтаксис
public function dispatch(object $message, array $stamps = []): Envelope
Пример
Давайте создадим класс сообщения SendEmailMessage
и отправим его в шину через метод dispatch:
<?php
namespace AppMessage;
class SendEmailMessage
{
public function __construct(
public string $email,
public string $text
) {
}
}
?>
Теперь вызовем метод dispatch в контроллере:
<?php
namespace AppController;
use AppMessageSendEmailMessage;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentRoutingAttributeRoute;
class MessageController extends AbstractController
{
#[Route('/message', name: 'message_send')]
public function send(MessageBusInterface $bus): Response
{
$message = new SendEmailMessage('abcde', 'hello');
$envelope = $bus->dispatch($message);
return new Response('message sent');
}
}
?>
Результат выполнения кода:
"message sent"
Пример
Давайте передадим сообщение с задержкой через штамп DelayStamp
вторым параметром:
<?php
namespace AppController;
use AppMessageSendEmailMessage;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerStampDelayStamp;
use SymfonyComponentRoutingAttributeRoute;
class MessageController extends AbstractController
{
#[Route('/message/delayed', name: 'message_delayed')]
public function delayed(MessageBusInterface $bus): Response
{
$message = new SendEmailMessage('abcde', 'hello');
$envelope = $bus->dispatch($message, [
new DelayStamp(5000)
]);
return new Response('message delayed');
}
}
?>
Результат выполнения кода:
"message delayed"
Пример
Давайте отправим сообщение в конкретный транспорт
через штамп TransportNamesStamp:
<?php
namespace AppController;
use AppMessageSendEmailMessage;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerStampTransportNamesStamp;
use SymfonyComponentRoutingAttributeRoute;
class MessageController extends AbstractController
{
#[Route('/message/transport', name: 'message_transport')]
public function transport(MessageBusInterface $bus): Response
{
$message = new SendEmailMessage('abcde', 'hello');
$envelope = $bus->dispatch($message, [
new TransportNamesStamp(['async'])
]);
return new Response('message routed');
}
}
?>
Результат выполнения кода:
"message routed"
Пример
Давайте получим результат обработки из конверта
через метод last и штамп HandledStamp:
<?php
namespace AppController;
use AppMessageSendEmailMessage;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerStampHandledStamp;
use SymfonyComponentRoutingAttributeRoute;
class MessageController extends AbstractController
{
#[Route('/message/handled', name: 'message_handled')]
public function handled(MessageBusInterface $bus): Response
{
$message = new SendEmailMessage('abcde', 'hello');
$envelope = $bus->dispatch($message);
$stamp = $envelope->last(HandledStamp::class);
$res = $stamp->getResult();
return new Response($res);
}
}
?>
Результат выполнения кода:
"email sent"
Смотрите также
-
класс
MessageBus,
который представляет шину сообщений -
класс
Envelope,
который оборачивает сообщение и его штампы -
метод
last,
который возвращает последний штамп указанного типа -
класс
DelayStamp,
который задаёт задержку перед обработкой сообщения