Quick note: Middleware come Chain of Responsibility
Ogni anello decide se passare al successivo Lo stack middleware di Soft PHP MVC e una Chain of Responsibility: ogni middleware riceve la request, decide se gestirla o passarla al successivo, e puΓ² modificare la respons
Ogni anello decide se passare al successivo
Lo stack middleware di Soft PHP MVC e una Chain of Responsibility: ogni middleware riceve la request, decide se gestirla o passarla al successivo, e puΓ² modificare la response in uscita. CsrfMiddleware verifica il token β se manca, risponde 403 e la catena si interrompe. RateLimitMiddleware conta le richieste β se il limite e superato, risponde 429. AuthMiddleware verifica la sessione β se non autenticato, redirige al login. Ogni anello e un filtro autonomo con una logica precisa.
La potenza del pattern e nella composibilita: l'ordine dei middleware conta, ma ogni middleware e indipendente. Puoi aggiungere, rimuovere o riordinare anelli senza toccare gli altri. Il VisitorTrackingMiddleware e stato aggiunto alla catena senza modificare una riga dei middleware esistenti β e questo e il test definitivo di un buon Chain of Responsibility. L'Open/Closed Principle in azione: la catena e aperta all'estensione (nuovi anelli), chiusa alla modifica (anelli esistenti non cambiano).
Cos'e il Chain of Responsibility: definizione formale
Il Gang of Four definisce il Chain of Responsibility come un pattern comportamentale che "evita di accoppiare il mittente di una richiesta al suo destinatario, dando a piΓΉ oggetti la possibilita di gestire la richiesta. Gli oggetti riceventi vengono concatenati e la richiesta viene passata lungo la catena fino a quando un oggetto la gestisce". I due elementi chiave sono: l'Handler (l'interfaccia comune a tutti gli anelli) e la catena (la sequenza ordinata di handler).
A differenza dell'Observer, dove tutti gli osservatori vengono notificati, nella Chain of Responsibility la richiesta puΓ² fermarsi a qualsiasi anello. Un middleware che risponde con un errore 403 interrompe la catena β i middleware successivi non vengono eseguiti. Questa capacitΓ di cortocircuito e fondamentale per la sicurezza: il CsrfMiddleware deve poter bloccare una richiesta malevola prima che raggiunga il controller.
L'anatomia di un middleware in Soft PHP MVC
Ogni middleware nel framework implementa un contratto semplice: riceve la request e un callable che rappresenta il prossimo anello della catena. Il middleware puΓ²:
- Passare la request al successivo β chiama il callable e restituisce la response (middleware trasparente)
- Modificare la request β aggiunge header, normalizza input, poi passa al successivo
- Interrompere la catena β restituisce una response direttamente (errore, redirect, cache hit)
- Modificare la response β chiama il successivo, poi modifica la response prima di restituirla
Questa flessibilita rende il middleware una primitiva estremamente potente. Non e un caso che la quasi totalita dei framework PHP moderni β Laravel, Symfony, Slim β adotti lo stesso pattern per il request handling. La Chain of Responsibility nel contesto HTTP e diventata uno standard de facto dell'ecosistema PHP.
Middleware concreti nel framework
Lo stack middleware di Soft PHP MVC include anelli con responsabilitΓ diverse:
- CsrfMiddleware β verifica il token CSRF su richieste POST/PUT/DELETE, protegge da attacchi cross-site request forgery
- RateLimitMiddleware β limita le richieste per IP in una finestra temporale, previene abusi e DDoS
- AuthMiddleware β verifica l'autenticazione, redirige al login se la sessione e scaduta
- VisitorTrackingMiddleware β traccia i visitatori unici per analytics, senza bloccare la request
- MaintenanceModeMiddleware β intercetta tutte le richieste e mostra la pagina di manutenzione quando attivo
L'ordine e significativo: il CSRF check avviene prima dell'auth, perchΓ© una richiesta senza token valido non dovrebbe nemmeno arrivare al controllo dell'autenticazione. Il rate limiting avviene prima di tutto, perchΓ© un attacco brute force non dovrebbe consumare risorse per verificare token o sessioni.
Pipeline pattern: l'evoluzione del Chain of Responsibility
In molti framework moderni, il Chain of Responsibility per i middleware e implementato come Pipeline: un oggetto che riceve una lista di handler e li esegue in sequenza, passando il risultato di uno come input del successivo. La Pipeline e una variante piΓΉ strutturata della catena classica β invece di lasciare che ogni anello conosca il successivo, la pipeline li orchestra dall'esterno.
In Soft PHP MVC, il kernel HTTP costruisce la pipeline al boot dell'applicazione, concatenando i middleware configurati nel file di routing. La pipeline e immutabile dopo la costruzione: l'ordine degli anelli non cambia durante l'esecuzione. Questa immutabilita semplifica il debugging e garantisce un comportamento predicibile β la stessa request attraversa sempre gli stessi anelli nello stesso ordine.
Quando usare la Chain of Responsibility
Il pattern e ideale quando:
- PiΓΉ oggetti possono gestire una richiesta e il gestore corretto non e noto a priori
- L'ordine di gestione e importante ma deve essere configurabile
- Nuovi gestori devono poter essere aggiunti senza modificare quelli esistenti
- Una richiesta deve poter essere rifiutata a qualsiasi livello della catena
Oltre ai middleware HTTP, la Chain of Responsibility si applica a validazione (ogni regola e un anello che puΓ² bloccare), logging (ogni handler decide se loggare e a quale livello), e event handling (ogni listener puΓ² marcare l'evento come gestito). In Soft PHP MVC, il middleware e l'applicazione principale, ma il pattern e una risorsa architetturale disponibile ogni volta che serve una catena decisionale configurabile e aperta all'estensione.
Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.