Chain of Responsibility es un patrón de diseño de comportamiento que permite pasar solicitudes a lo largo de la cadena de manejadores potenciales hasta que uno de ellos gestiona la solicitud.
El patrón permite que varios objetos gestionen la solicitud sin acoplar la clase emisora a las clases concretas de los receptores. La cadena puede componerse dinámicamente durante el tiempo de ejecución con cualquier manejador que siga una interfaz manejadora estándar.
Ejemplos de uso: El patrón Chain of Responsibility no es muy común en PHP porque requiere que el programa tenga cadenas de objetos. Posiblemente uno de los ejemplos más famosos del uso de este patrón en PHP es el middleware de solicitud HTTP descrito en PSR-15.
Identificación: El patrón es reconocible porque los métodos de comportamiento de un grupo de objetos invocan indirectamente los mismos métodos en otros objetos, mientras que todos los objetos siguen la interfaz común.
Ejemplo conceptual
Este ejemplo ilustra la estructura del patrón de diseño Chain of Responsibility y se centra en las siguientes preguntas:
¿De qué clases se compone?
¿Qué papeles juegan esas clases?
¿De qué forma se relacionan los elementos del patrón?
Después de conocer la estructura del patrón, será más fácil comprender el siguiente ejemplo basado en un caso de uso real de PHP.
index.php: Ejemplo conceptual
Output.txt: Resultado de la ejecución
Ejemplo del mundo real
El uso más conocido del patrón Chain of Responsibility (CoR) en el mundo PHP se encuentra en el middleware de solicitud HTTP. Se implementan con los frameworks PHP más populares y se estandarizan como parte de PSR-15.
Funciona así: una solicitud HTTP debe pasar por una pila de objetos de middleware para ser gestionada por la aplicación. Cada middleware puede rechazar el procesamiento posterior de la solicitud o pasarla al siguiente middleware. Una vez que la solicitud pasa con éxito todo el middleware, el manejador principal de la aplicación pueden por fin gestionarla.
Puede que hayas observado que este proceso es el contrario al propósito original del patrón. De hecho, en la implementación típica, una solicitud sólo se pasa por la cadena si un manejador actual no puede procesarla, mientras que un middleware pasa la solicitud por la cadena cuando cree que la aplicación PUEDE gestionar la solicitud. No obstante, como los objetos de middleware están encadenados, el concepto sigue considerándose un ejemplo del patrón CoR.