Dev-IadicolaPillar article su Action-Domain-Responder: come l'evoluzione di MVC proposta da Paul M. Jones risolve i problemi dei controller troppo grandi.
MVC e stato progettato per interfacce desktop con interazione continua. Nel web, il ciclo e diverso: una request arriva, viene elaborata, una response parte. Non c'e interazione continua — e un singolo scambio. Eppure forziamo la logica in Controller con molti metodi (index, show, store, update, destroy) che fanno cose completamente diverse. Un UserController con 7 metodi e 7 responsabilità: non e coeso.
ADR (Action-Domain-Responder), proposto da Paul M. Jones nel 2014, e una reinterpretazione di MVC specifica per il web HTTP. L'idea: ogni endpoint e una singola Action (classe) che chiama il Domain e passa il risultato a un Responder.
L'Action e una classe con un singolo metodo (__invoke()) che gestisce un singolo endpoint. Non UserController con 7 metodi, ma CreateUserAction, ListUsersAction, DeleteUserAction — ognuna con una sola responsabilità. L'Action estrae i dati dalla request, chiama il Domain, e passa il risultato al Responder.
Il Domain e identico al Model/Service Layer: contiene la business logic, indipendente da HTTP. Riceve dati primitivi, esegue la logica, restituisce risultati o lancia eccezioni. L'Action non contiene logica di business — delega tutto al Domain.
Il Responder traduce il risultato del Domain in una HTTP response. Se il Domain restituisce un utente, il Responder decide se renderizzare HTML, JSON, XML, o un redirect. La logica di presentazione — quale status code, quali header, quale formato — e nel Responder, non nell'Action.
UserController::store(), UserController::index(). Responsabilità multiple.CreateUserAction::__invoke(). Singola responsabilità.Un endpoint per creare un utente:
CreateUserAction: estrae name ed email dalla request, chiama $this->domain->createUser($name, $email), passa il risultato a $this->responder->created($user) o $this->responder->validationError($errors).UserDomain: valida i dati, crea l'utente nel database, dispara l'evento UserCreated. Nessuna dipendenza da HTTP.UserResponder: se il risultato e un utente, restituisce 201 con JSON o redirect. Se sono errori, restituisce 422 con il form e i messaggi.CreateUserAction. Non devi cercare quale metodo di quale controller.ADR non e un sostituto di MVC: e un'evoluzione per il contesto HTTP. Quando i controller crescono e la coesione diminuisce, ADR riporta ordine con una regola semplice: una classe, un endpoint, una responsabilità.