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

Метод with класса Envelope

Метод with класса Envelope создаёт новый конверт сообщения, добавляя к нему переданные штампы. Первым параметром передаётся штамп, который нужно добавить. Метод не изменяет исходный конверт, а возвращает его копию с новым набором штампов.

Штампы несут служебную информацию о сообщении: задержку доставки, имя транспорта, имя шины, сериализатор и так далее. Добавляя штамп через метод with, вы управляете тем, как сообщение будет обработано при отправке в очередь.

Синтаксис

public function with(StampInterface ...$stamps): Envelope

Пример

Давайте создадим конверт с сообщением и добавим к нему штамп задержки DelayStamp, чтобы сообщение попало в очередь не сразу, а через 10 секунд:

<?php namespace App\Message; class ArticleMessage { public function __construct( private string $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\Envelope; use Symfony\Component\Messenger\Stamp\DelayStamp; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_send')] public function send(): Response { $envelope = new Envelope(new ArticleMessage('hello')); $envelope = $envelope->with(new DelayStamp(10000)); $stamps = $envelope->all(DelayStamp::class); return new Response((string) $stamps[0]->getDelay()); } } ?>

Результат выполнения кода:

"10000"

Пример

Метод with принимает несколько штампов сразу. Давайте добавим к конверту штамп задержки и штамп имени шины BusNameStamp:

<?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('/article/multi', name: 'article_multi')] public function multi(): Response { $envelope = new Envelope(new ArticleMessage('abcde')); $envelope = $envelope->with( new DelayStamp(5000), new BusNameStamp('article.bus') ); $bus = $envelope->last(BusNameStamp::class); return new Response($bus->getBusName()); } } ?>

Результат выполнения кода:

"article.bus"

Пример

Метод 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\DelayStamp; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/immutable', name: 'article_immutable')] public function immutable(): Response { $envelope = new Envelope(new ArticleMessage('user')); $before = count($envelope->all()); $newEnvelope = $envelope->with(new DelayStamp(1000)); $after = count($envelope->all()); $newAfter = count($newEnvelope->all()); return new Response($before . ' ' . $after . ' ' . $newAfter); } } ?>

Результат выполнения кода:

"0 0 1"

Смотрите также

  • класс Envelope,
    который оборачивает сообщение и его штампы
  • метод wrap,
    который создаёт конверт из сообщения
  • метод all,
    который возвращает все штампы конверта
  • класс DelayStamp,
    который задаёт задержку доставки сообщения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить