Класс Envelope
Класс Envelope представляет собой контейнер,
который оборачивает само сообщение и набор штампов
(stamps). Штампы - это метаданные, которые управляют
поведением сообщения: задержкой доставки, именем
транспорта, сериализацией и другими настройками.
Конструктор принимает первым параметром объект
сообщения, а вторым - массив штампов.
Компонент Messenger всегда передаёт обработчикам
именно Envelope, а не голое сообщение.
Через методы wrap, with и
withoutAll можно создавать новые конверты
с изменённым набором штампов, не мутируя исходный
объект.
Синтаксис
new Envelope(object $message, array $stamps = [])
Пример
Давайте создадим конверт с сообщением и одним штампом задержки:
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
public string $title = 'article'
) {
}
}
?>
Теперь обернём сообщение в конверт и добавим штамп:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/envelope', name: 'article_envelope')]
public function index(): Response
{
$message = new ArticleMessage('abcde');
$envelope = new Envelope($message, [
new DelayStamp(5000),
]);
return new Response(get_class($envelope->getMessage()));
}
}
?>
Результат выполнения кода:
"App\Message\ArticleMessage"
Пример
Давайте добавим новый штамп к уже созданному конверту
через метод with и получим его обратно:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\BusNameStamp;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/envelope-with', name: 'article_envelope_with')]
public function index(): Response
{
$message = new ArticleMessage('user');
$envelope = new Envelope($message);
$envelope = $envelope->with(new DelayStamp(3000));
$envelope = $envelope->with(new BusNameStamp('command.bus'));
$stamps = $envelope->all();
return new Response((string) count($stamps));
}
}
?>
Результат выполнения кода:
"2"
Пример
Давайте создадим конверт с несколькими штампами
и удалим их все через withoutAll:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/envelope-without', name: 'article_envelope_without')]
public function index(): Response
{
$message = new ArticleMessage('hello');
$envelope = new Envelope($message, [
new DelayStamp(1000),
new TransportNamesStamp(['async']),
]);
$clean = $envelope->withoutAll(DelayStamp::class);
$delays = $clean->all(DelayStamp::class);
return new Response((string) count($delays));
}
}
?>
Результат выполнения кода:
"0"
Смотрите также
-
метод
wrap,
который оборачивает сообщение в конверт -
метод
with,
который добавляет штамп к конверту -
метод
all,
который возвращает все штампы конверта -
класс
MessageBus,
который отправляет конверты в шину