Использование паттерна Декоратор для логирования с PSR-14 EventDispatcherInterface и PSR-3
В разработке программного обеспечения существует постоянная потребность в логировании событий для отслеживания, анализа и обеспечения надежности приложений. При этом важно, чтобы логирование не засоряло код и было легко настраиваемым. В этой статье мы рассмотрим, как использовать паттерн Декоратор в сочетании с интерфейсами PSR-14 EventDispatcherInterface и PSR-3 для эффективного логирования.
Введение в паттерн Декоратор
Паттерн Декоратор - это структурный шаблон проектирования, который позволяет добавлять новую функциональность объектам, не изменяя их структуры. Он особенно полезен для добавления функциональности без внесения изменений в уже существующий код.
PSR-14 EventDispatcherInterface
PSR-14 - это стандарт PHP-FIG, который определяет интерфейс EventDispatcherInterface
. Этот интерфейс предоставляет механизм для работы с событиями и слушателями событий в приложении. Мы будем использовать его в качестве примера.
PSR-3: Логирование
PSR-3 - еще один стандарт PHP-FIG, определяющий интерфейс для логирования. Он позволяет логировать сообщения различных уровней (например, информационные, отладочные, ошибки) и делает логирование легко настраиваемым.
Создание Декоратора для логирования
Давайте создадим Декоратор для логирования событий, передаваемых через EventDispatcherInterface
. В качестве логгера мы будем использовать класс, реализующий PSR-3 LoggerInterface
.
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Log\LoggerInterface;
class LoggingEventDispatcherDecorator implements EventDispatcherInterface
{
private $eventDispatcher;
private $logger;
public function __construct(EventDispatcherInterface $eventDispatcher, LoggerInterface $logger)
{
$this->eventDispatcher = $eventDispatcher;
$this->logger = $logger;
}
public function dispatch(object $event): object
{
$this->logger->info('Dispatching event: ' . get_class($event));
// Передача события оригинальному диспетчеру
$result = $this->eventDispatcher->dispatch($event);
$this->logger->info('Event dispatched: ' . get_class($event));
return $result;
}
}
В этом примере LoggingEventDispatcherDecorator
принимает два объекта: EventDispatcherInterface
и LoggerInterface
. Он записывает информацию о событиях перед и после их обработки и затем передает событие оригинальному диспетчеру.
Пример использования
Теперь давайте рассмотрим пример использования нашего Декоратора:
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Log\LoggerInterface;
$originalDispatcher = new OriginalEventDispatcher(); // Замените на ваш реальный диспетчер
$logger = new YourLogger(); // Замените на ваш реальный логгер
$loggingDispatcher = new LoggingEventDispatcherDecorator($originalDispatcher, $logger);
// Теперь используйте $loggingDispatcher вместо $originalDispatcher для логирования событий.
Заключение
Паттерн Декоратор - мощный инструмент для добавления функциональности к существующему коду без его изменения. В сочетании с интерфейсами PSR-14 EventDispatcherInterface и PSR-3 LoggerInterface, он позволяет эффективно логировать события в приложениях, делая код более чистым и легко настраиваемым.