Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
1325 of 1361 menu
◀ ▶

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

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

Конверт в Symfony - это обёртка вокруг сообщения, которая хранит само сообщение и набор штампов. Штампы несут служебную информацию: задержку, имя шины, транспорт и так далее. Метод withoutAll позволяет снять сразу все штампы одного типа, в отличие от withoutStampsOfType, который работает аналогично, и with, который, наоборот, добавляет штамп.

Синтаксис

public function withoutAll(string $stampFqcn): Envelope

Параметр $stampFqcn - это полное имя класса штампа, например Symfony\Component\Messenger\Stamp\DelayStamp.

Пример

Давайте создадим конверт с несколькими штампами и удалим все штампы типа DelayStamp:

<?php namespace App\Message; class ArticleMessage { public function __construct( public string $title = 'abcde', ) { } } ?>
<?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\BusNameStamp; class ArticleController extends AbstractController { public function index(): Response { $message = new ArticleMessage('article'); $envelope = new Envelope($message); $envelope = $envelope->with(new DelayStamp(1000)); $envelope = $envelope->with(new DelayStamp(2000)); $envelope = $envelope->with(new BusNameStamp('command.bus')); $res = $envelope->withoutAll(DelayStamp::class); echo count($envelope->all(DelayStamp::class)); echo ' '; echo count($res->all(DelayStamp::class)); echo ' '; echo count($res->all(BusNameStamp::class)); return new Response('ok'); } } ?>

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

"2 0 1"

Как видно из результата, исходный конверт сохранил оба штампа DelayStamp, а новый конверт не содержит ни одного из них, при этом штамп BusNameStamp остался на месте.

Пример

Давайте применим метод 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\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; class ArticleController extends AbstractController { public function index(MessageBusInterface $bus): Response { $message = new ArticleMessage('article'); $envelope = new Envelope($message); $envelope = $envelope->with(new DelayStamp(5000)); $envelope = $envelope->withoutAll(DelayStamp::class); $bus->dispatch($envelope); return new Response('sent'); } } ?>

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

sent

Сообщение уйдёт в шину без задержки, так как все штампы DelayStamp были удалены из конверта.

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

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