Команда make:messenger-middleware
Команда make:messenger-middleware создаёт новый класс middleware для компонента Messenger.
Middleware позволяет перехватывать сообщения при отправке или обработке и выполнять над ними
дополнительные действия: логирование, изменение, фильтрацию, замер времени и многое другое.
Первым параметром передаётся имя создаваемого класса. Команда генерирует файл в каталоге
src/Messenger/Middleware и автоматически регистрирует его в конфигурации Messenger.
Middleware в Messenger бывают двух типов: для отправки сообщений в шину (bus middleware) и для обработки сообщений в транспорте (transport middleware). По умолчанию команда создаёт middleware для обработки в транспорте.
Синтаксис
php bin/console make:messenger-middleware <name>
Пример
Давайте создадим middleware с именем AuditMiddleware:
php bin/console make:messenger-middleware AuditMiddleware
После выполнения команды в терминале появится сообщение об успешном создании:
created: src/Messenger/Middleware/AuditMiddleware.php
Success!
Будет создан следующий класс:
<?php
namespace AppMessengerMiddleware;
use SymfonyComponentMessengerEnvelope;
use SymfonyComponentMessengerMiddlewareMiddlewareInterface;
use SymfonyComponentMessengerMiddlewareStackMiddlewareInterface as StackMiddlewareInterface;
class AuditMiddleware implements MiddlewareInterface
{
public function handle(Envelope $envelope, StackMiddlewareInterface $stack): Envelope
{
// do something before handling the message
$envelope = $stack->next()->handle($envelope, $stack);
// do something after handling the message
return $envelope;
}
}
?>
Метод handle вызывается для каждого сообщения. Код до вызова $stack->next()->handle
выполняется перед обработкой сообщения, а код после - после обработки.
Пример
Давайте добавим логирование в созданный middleware:
<?php
namespace AppMessengerMiddleware;
use PsrLogLoggerInterface;
use SymfonyComponentMessengerEnvelope;
use SymfonyComponentMessengerMiddlewareMiddlewareInterface;
use SymfonyComponentMessengerMiddlewareStackMiddlewareInterface as StackMiddlewareInterface;
class AuditMiddleware implements MiddlewareInterface
{
private LoggerInterface $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function handle(Envelope $envelope, StackMiddlewareInterface $stack): Envelope
{
$this->logger->info('Message received', [
'message' => $envelope->getMessage()::class,
]);
$envelope = $stack->next()->handle($envelope, $stack);
$this->logger->info('Message handled', [
'message' => $envelope->getMessage()::class,
]);
return $envelope;
}
}
?>
Результат выполнения кода при обработке сообщения:
["Message received", "Message handled"]
Пример
Давайте создадим middleware для шины сообщений. Для этого используется опция --bus:
php bin/console make:messenger-middleware ValidationMiddleware --bus
Будет создан класс, реализующий интерфейс middleware для шины:
<?php
namespace AppMessengerMiddleware;
use SymfonyComponentMessengerEnvelope;
use SymfonyComponentMessengerMiddlewareMiddlewareInterface;
use SymfonyComponentMessengerMiddlewareStackMiddlewareInterface as StackMiddlewareInterface;
class ValidationMiddleware implements MiddlewareInterface
{
public function handle(Envelope $envelope, StackMiddlewareInterface $stack): Envelope
{
// validate the message before dispatching
return $stack->next()->handle($envelope, $stack);
}
}
?>
Пример
После создания middleware его необходимо зарегистрировать в конфигурации Messenger.
Давайте добавим его в файл config/packages/messenger.yaml:
framework:
messenger:
buses:
default:
middleware:
- AppMessengerMiddlewareAuditMiddleware
- AppMessengerMiddlewareValidationMiddleware
Порядок перечисления middleware определяет порядок их вызова. Первый в списке middleware будет вызван первым.
Смотрите также
-
команда
make:message,
которая создаёт класс сообщения для Messenger -
команда
messenger:consume,
которая запускает обработку сообщений из очереди -
команда
debug:messenger,
которая показывает список зарегистрированных обработчиков -
команда
messenger:stats,
которая выводит статистику по транспортам