Метод 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 были удалены из конверта.