miércoles, 25 de junio de 2025

Desacoplamiento Avanzado con Mediadores de Eventos Personalizados en PHP

Desacoplamiento Avanzado con Mediadores de Eventos Personalizados en PHP

El desacoplamiento es un principio fundamental en el desarrollo de software robusto y mantenible. En PHP, podemos lograr un desacoplamiento aún mayor mediante la implementación de un mediador de eventos personalizado. En lugar de que los objetos se comuniquen directamente entre sí, interactúan a través de un mediador centralizado que gestiona la distribución de eventos. Esto reduce las dependencias directas y facilita la modificación y expansión del sistema.


// Definimos una interfaz para los eventos
interface EventInterface {
    public function getName(): string;
    public function getData(): array;
}

// Implementación simple de un evento
class UserCreatedEvent implements EventInterface {
    private string $name = 'user.created';
    private array $data;

    public function __construct(array $data) {
        $this->data = $data;
    }

    public function getName(): string {
        return $this->name;
    }

    public function getData(): array {
        return $this->data;
    }
}

// Interfaz para los listeners de eventos
interface ListenerInterface {
    public function handle(EventInterface $event): void;
}

// Implementación de un listener que envia un email
class SendWelcomeEmailListener implements ListenerInterface {
    public function handle(EventInterface $event): void {
        $userData = $event->getData();
        // Lógica para enviar el email de bienvenida, usando $userData
        echo "Enviando email de bienvenida a: " . $userData['email'] . "\n";
    }
}
    

El mediador, la pieza central de este patrón, actúa como un punto centralizado para la gestión de eventos. Los componentes emiten eventos al mediador, y el mediador se encarga de notificar a los listeners registrados para ese evento en particular. Esto evita que los componentes tengan conocimiento directo de otros componentes.


// La clase Mediador
class EventMediator {
    private array $listeners = [];

    // Registrar un listener para un evento
    public function attach(string $eventName, ListenerInterface $listener): void {
        if (!isset($this->listeners[$eventName])) {
            $this->listeners[$eventName] = [];
        }
        $this->listeners[$eventName][] = $listener;
    }

    // Dispatch de un evento a los listeners registrados
    public function dispatch(EventInterface $event): void {
        $eventName = $event->getName();
        if (isset($this->listeners[$eventName])) {
            foreach ($this->listeners[$eventName] as $listener) {
                $listener->handle($event);
            }
        }
    }
}

// Ejemplo de uso
$mediator = new EventMediator();

// Registrar el listener para el evento 'user.created'
$mediator->attach('user.created', new SendWelcomeEmailListener());

// Crear un evento
$userData = ['email' => 'test@example.com', 'name' => 'Test User'];
$userCreatedEvent = new UserCreatedEvent($userData);

// Disparar el evento a través del mediador
$mediator->dispatch($userCreatedEvent);
    

Implementar un mediador de eventos personalizado ofrece un control preciso sobre el flujo de eventos en tu aplicación PHP. Permite añadir, modificar y eliminar listeners con facilidad, lo que mejora la flexibilidad y la mantenibilidad. Además, facilita la implementación de lógicas complejas, como el filtrado de eventos o la ejecución condicional de listeners, centralizando la responsabilidad de la gestión de eventos en una sola clase.

No hay comentarios:

Publicar un comentario