Использование паттерна Декоратор для логирования с 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, он позволяет эффективно логировать события в приложениях, делая код более чистым и легко настраиваемым.