Метод wrap
Метод wrap класса Envelope создаёт новый конверт из объекта сообщения. Первым параметром передаётся само сообщение, вторым - массив штампов. Штампы - это метаданные, которые управляют поведением сообщения при отправке через шину. Метод возвращает объект Envelope, готовый к передаче в шину через метод dispatch.
Синтаксис
Envelope::wrap(object $message, array $stamps = []): Envelope
Пример
Давайте обернём простое сообщение без штампов:
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
public string $title,
) {
}
}
?>
Теперь создадим конверт из этого сообщения:
<?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\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$message = new ArticleMessage('hello');
$envelope = Envelope::wrap($message);
return new Response(get_class($envelope->getMessage()));
}
}
?>
Результат выполнения кода:
"App\Message\ArticleMessage"
Пример
Давайте обернём сообщение с задержкой отправки через DelayStamp:
<?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/delay', name: 'article_delay')]
public function delay(): Response
{
$message = new ArticleMessage('abcde');
$envelope = Envelope::wrap($message, [
new DelayStamp(5000),
]);
$stamp = $envelope->last(DelayStamp::class);
return new Response((string) $stamp->getDelay());
}
}
?>
Результат выполнения кода:
"5000"
Пример
Давайте обернём сообщение с несколькими штампами и прочитаем их:
<?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/stamps', name: 'article_stamps')]
public function stamps(): Response
{
$message = new ArticleMessage('user');
$envelope = Envelope::wrap($message, [
new DelayStamp(1000),
new BusNameStamp('async'),
]);
$delay = $envelope->last(DelayStamp::class);
$bus = $envelope->last(BusNameStamp::class);
return new Response($delay->getDelay() . ' ' . $bus->getBusName());
}
}
?>
Результат выполнения кода:
"1000 async"
Смотрите также
-
класс
Envelope,
который представляет собой конверт сообщения -
метод
getMessage,
который возвращает исходное сообщение из конверта -
метод
dispatch,
который отправляет конверт в шину сообщений -
класс
MessageBus,
который управляет отправкой сообщений