Класс MessageBus
Класс MessageBus представляет собой шину сообщений,
через которую происходит отправка сообщений в Messenger.
Он реализует интерфейс MessageBusInterface и
предоставляет метод dispatch для передачи сообщения
в обработчики или транспорты. Экземпляр класса создаётся
автоматически через контейнер зависимостей.
Синтаксис
use Symfony\Component\Messenger\MessageBusInterface;
public function __construct(MessageBusInterface $bus)
{
$this->bus = $bus;
}
Пример
Давайте создадим простой класс сообщения и отправим его через шину:
<?php
namespace App\Message;
class ArticleMessage
{
private string $text;
public function __construct(string $text)
{
$this->text = $text;
}
public function getText(): string
{
return $this->text;
}
}
?>
Теперь создадим контроллер, который внедряет шину и отправляет сообщение:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_send')]
public function send(MessageBusInterface $bus): Response
{
$message = new ArticleMessage('hello');
$bus->dispatch($message);
return new Response('sent');
}
}
?>
Результат выполнения кода для адреса /article:
"sent"
Пример
Давайте отправим сообщение и получим результат
его обработки через объект Envelope:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use App\MessageHandler\ArticleMessageHandler;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\HandledStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/handle', name: 'article_handle')]
public function handle(MessageBusInterface $bus): Response
{
$envelope = $bus->dispatch(new ArticleMessage('abcde'));
$stamp = $envelope->last(HandledStamp::class);
$res = $stamp->getResult();
return new Response($res);
}
}
?>
Класс обработчика для сообщения:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class ArticleMessageHandler
{
public function __invoke(ArticleMessage $message): string
{
return 'handled: ' . $message->getText();
}
}
?>
Результат выполнения кода для адреса /article/handle:
"handled: abcde"
Смотрите также
-
метод
dispatch,
который отправляет сообщение в шину -
класс
Envelope,
который оборачивает сообщение и его штампы -
атрибут
AsMessageHandler,
который помечает класс как обработчик -
класс
HandledStamp,
который хранит результат обработки