Класс HandledStamp
Класс HandledStamp представляет собой штамп (stamp),
который добавляется в конверт Envelope после успешной
обработки сообщения. Штамп содержит результат, возвращённый
методом __invoke обработчика, а также имя класса
этого обработчика. Основное применение - извлечение результата
синхронной обработки сообщения через шину.
Синтаксис
<?php
use Symfony\Component\Messenger\Stamp\HandledStamp;
$stamp = new HandledStamp(mixed $result, string $handlerName);
$stamp->getResult();
$stamp->getHandlerName();
?>
Пример
Давайте создадим сообщение и обработчик, который возвращает строку,
а затем извлечём результат через HandledStamp:
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
public readonly string $text,
) {
}
}
?>
<?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->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\Messenger\Stamp\HandledStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
$envelope = $bus->dispatch(new ArticleMessage('abcde'));
$stamp = $envelope->last(HandledStamp::class);
return new Response($stamp->getResult());
}
}
?>
Результат выполнения кода:
handled: abcde
Пример
Давайте извлечём имя обработчика, который обработал сообщение:
<?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\Messenger\Stamp\HandledStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
$envelope = $bus->dispatch(new ArticleMessage('abcde'));
$stamp = $envelope->last(HandledStamp::class);
return new Response($stamp->getHandlerName());
}
}
?>
Результат выполнения кода:
"App\MessageHandler\ArticleMessageHandler"
Смотрите также
-
класс
Envelope,
который хранит сообщение и штампы -
метод
last,
который возвращает последний штамп указанного типа -
метод
all,
который возвращает все штампы указанного типа -
класс
MessageBus,
который выполняет диспетчеризацию сообщений