miércoles, 25 de junio de 2025

Programación reactiva con SplSubject y SplObserver en PHP

Programación reactiva con SplSubject y SplObserver en PHP

La programación reactiva es un paradigma que se centra en el flujo de datos y la propagación del cambio. En PHP, aunque no tenemos librerías reactivas tan robustas como en otros lenguajes, podemos implementar un patrón observer rudimentario usando las interfaces SplSubject y SplObserver.

Este enfoque permite que un objeto (el "sujeto") notifique automáticamente a sus dependientes (los "observadores") cuando su estado cambia. Esto facilita la creación de aplicaciones con una lógica más desacoplada y reactiva a los eventos.

El siguiente ejemplo muestra cómo podemos usar SplSubject y SplObserver para construir un sistema simple de notificación de eventos. Imagina un objeto que representa un artículo de blog; cuando se actualiza el contenido del artículo, queremos notificar a los observadores (por ejemplo, para actualizar un índice de búsqueda o enviar una notificación por correo electrónico).


<?php

class BlogPost implements SplSubject {
    private $title;
    private $content;
    private $observers = [];

    public function __construct(string $title, string $content) {
        $this->title = $title;
        $this->content = $content;
    }

    public function attach(SplObserver $observer): void {
        $this->observers[] = $observer;
    }

    public function detach(SplObserver $observer): void {
        $key = array_search($observer, $this->observers, true);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    public function notify(): void {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function updateContent(string $newContent): void {
        $this->content = $newContent;
        $this->notify();
    }

    public function getContent(): string {
        return $this->content;
    }

    public function getTitle(): string {
        return $this->title;
    }
}

class SearchIndexUpdater implements SplObserver {
    public function update(SplSubject $subject): void {
        if ($subject instanceof BlogPost) {
            echo "Actualizando el índice de búsqueda para el artículo: " . $subject->getTitle() . " con contenido: " . substr($subject->getContent(), 0, 50) . "...\n";
            // Aquí iría la lógica para actualizar el índice de búsqueda
        }
    }
}

// Ejemplo de uso
$blogPost = new BlogPost("Mi primer artículo", "Este es el contenido inicial del artículo.");
$searchIndexUpdater = new SearchIndexUpdater();

$blogPost->attach($searchIndexUpdater);
$blogPost->updateContent("Este es el nuevo contenido actualizado del artículo.");
?>
    

En el código anterior, BlogPost implementa SplSubject, lo que le permite adjuntar, separar y notificar a los observadores. SearchIndexUpdater implementa SplObserver y define la lógica para reaccionar a los cambios en el BlogPost.

Este es un ejemplo básico, pero ilustra el principio. Puedes extender este patrón para crear sistemas de eventos más complejos y robustos, permitiendo que diferentes partes de tu aplicación reaccionen a los cambios de estado de manera desacoplada y eficiente.

No hay comentarios:

Publicar un comentario