Новое в Symfony 7.2: Атрибут AsMessage
AsMessage
, позволяющий настраивать транспорт(ы) непосредственно в классе сообщенияКомпонент Messenger представляет шину сообщений с возможностью отправки сообщений и их синхронной или асинхронной обработки с помощью транспорта (очередей). Основными элементами Messenger являются сообщения (PHP класс хранящий данные), обработчики (PHP класс вызываемый при отправке поддерживаемых им сообщений) и транспорты (обрабатывающие отправку и отправку сообщений).
Если у вас есть класс сообщений, подобный этому:
// src/Message/SomeNotification.php
namespace App\Message;
class SomeNotification
{
public function __construct(
private string $content,
) {
}
public function getContent(): string
{
return $this->content;
}
}
Предполагая, что вы также определили класс SomeNotificationHandler
в приложении, вы можете использовать следующую конфигурацию, чтобы сообщить Symfony, что сообщение должно быть отправлено в транспорт/очередь под названием async
:
# config/packages/messenger.yaml
framework:
messenger:
transports:
async: "%env(MESSENGER_TRANSPORT_DSN)%"
routing:
'App\Message\SomeNotification': async
В Symfony 7.2 вводится новый атрибут #[AsMessage]
, позволяющий настраивать транспорт(ы) непосредственно в классе сообщения. В приведённом выше примере можно удалить конфигурацию routing:
в messenger.yaml
и добавить в класс сообщения следующее:
#[AsMessage('async')]
class SomeNotification
{
// ...
}
Этот атрибут позволяет передать более одного транспорта в случае, если вы отправляете сообщение на несколько транспортов:
#[AsMessage(['async', 'audit'])]
class SomeNotification
Если вы определяете обе конфигурации YAML/XML и атрибут PHP, конфигурация всегда имеет приоритет над атрибутом класса. Такое поведение позволяет вам переопределить маршрутизацию в зависимости от окружения.