Класс HandleTrait
Класс HandleTrait используется в классах, которые
хотят иметь возможность отправлять сообщения в шину
синхронно и получать результат. Он добавляет метод
handle, который принимает объект сообщения,
отправляет его через MessageBusInterface и
возвращает результат выполнения обработчика.
Синтаксис
use Symfony\Component\Messenger\HandleTrait;
class SomeService
{
use HandleTrait {
handle as private doHandle;
}
public function __construct(MessageBusInterface $messageBus)
{
$this->messageBus = $messageBus;
}
}
Пример
Давайте создадим сервис, который использует
HandleTrait для отправки сообщения и получения
результата:
<?php
namespace App\Service;
use Symfony\Component\Messenger\HandleTrait;
use Symfony\Component\Messenger\MessageBusInterface;
class ArticleService
{
use HandleTrait;
public function __construct(MessageBusInterface $messageBus)
{
$this->messageBus = $messageBus;
}
public function getArticleTitle(int $id): string
{
$query = new GetArticleTitleQuery($id);
$res = $this->handle($query);
return $res;
}
}
?>
Результат выполнения кода:
"article"
Пример
Давайте создадим класс сообщения и его обработчик,
а затем отправим сообщение через HandleTrait:
<?php
namespace App\Message;
class GetArticleTitleQuery
{
public function __construct(
private int $id,
) {
}
public function getId(): int
{
return $this->id;
}
}
?>
<?php
namespace App\MessageHandler;
use App\Message\GetArticleTitleQuery;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class GetArticleTitleQueryHandler
{
public function __invoke(GetArticleTitleQuery $query): string
{
return 'article ' . $query->getId();
}
}
?>
<?php
namespace App\Service;
use App\Message\GetArticleTitleQuery;
use Symfony\Component\Messenger\HandleTrait;
use Symfony\Component\Messenger\MessageBusInterface;
class ArticleService
{
use HandleTrait;
public function __construct(MessageBusInterface $messageBus)
{
$this->messageBus = $messageBus;
}
public function getArticleTitle(int $id): string
{
$query = new GetArticleTitleQuery($id);
$res = $this->handle($query);
return $res;
}
}
?>
Результат выполнения кода для $id = 1:
"article 1"
Смотрите также
-
класс
MessageBus,
который отправляет сообщения в шину -
метод
dispatch,
который выполняет отправку сообщения -
класс
Envelope,
который оборачивает сообщение и его штампы -
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений