РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1322 of 1361 menu

Класс 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,
    который отправляет конверты в шину
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить