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