Ottima domanda!
In termini di sviluppo del World Wide Web, cosa succederebbe anche se si chiedesse quanto segue.
"Se un input utente errato viene fornito a un controller da un'interfaccia utente, il controller dovrebbe aggiornare la vista in una sorta di ciclo ciclico, costringendo i comandi e i dati di input a essere precisi prima di elaborarli ? Come? Come viene aggiornata la vista normalmente? condizioni? Una vista è strettamente accoppiata a un modello? La logica di business principale della convalida dell'input dell'utente è il modello o è preliminare ad esso e quindi dovrebbe avvenire all'interno del controller (perché i dati di input dell'utente fanno parte della richiesta)?
(In effetti, si può e si dovrebbe ritardare l'istanza di un modello fino a quando non si acquisisce un input valido?)
La mia opinione è che i modelli dovrebbero gestire una circostanza pura e incontaminata (per quanto possibile), non ostacolata dalla convalida dell'input della richiesta HTTP di base che dovrebbe avvenire prima dell'istanza del modello (e sicuramente prima che il modello ottenga i dati di input). Poiché la gestione dei dati di stato (persistenti o meno) e delle relazioni API è il mondo del modello, consentire al controller la convalida dell'input della richiesta HTTP di base .
Riassumendo.
1) Convalida il tuo percorso (analizzato dall'URL), poiché il controller e il metodo devono esistere prima che qualsiasi altra cosa possa andare avanti. Questo dovrebbe sicuramente accadere nel regno del controller anteriore (classe Router), prima di arrivare al controller vero. Duh. :-)
2) Un modello può avere molte fonti di dati di input: una richiesta HTTP, un database, un file, un'API e sì, una rete. Se hai intenzione di inserire tutta la convalida dell'input nel modello, consideri la convalida dell'input della richiesta HTTP parte dei requisiti aziendali per il programma. Caso chiuso.
3) Tuttavia, è miope sostenere le spese di creare un'istanza di molti oggetti se l' input della richiesta HTTP non va bene! Puoi sapere se ** l'input della richiesta HTTP ** è buono ( fornito con la richiesta ) convalidandolo prima di creare un'istanza del modello e di tutte le sue complessità (sì, forse anche più validatori per i dati di input / output API e DB).
Prova quanto segue:
a) Il metodo di richiesta HTTP (GET, POST, PUT, PATCH, DELETE ...)
b) Controlli HTML minimi (ne hai abbastanza?).
c) Numero massimo di controlli HTML (ne hai troppi?).
d) Controlli HTML corretti (hai quelli giusti?).
e) Codifica di input (in genere, è la codifica UTF-8?).
f) Dimensione massima dell'input (uno degli input è fuori limite?).
Ricorda che potresti ottenere stringhe e file, quindi attendere che il modello crei un'istanza potrebbe diventare molto costoso quando le richieste colpiscono il tuo server.
Quello che ho descritto qui colpisce nell'intento della richiesta che arriva attraverso il controller. Omettere la verifica dell'intento rende l'applicazione più vulnerabile. L'intento può essere solo buono (giocando secondo le tue regole fondamentali) o cattivo (andando al di fuori delle tue regole fondamentali).
L'intento per una richiesta HTTP è una proposta tutto o niente. Tutto passa o la richiesta non è valida . Non è necessario inviare nulla al modello.
Questo livello di base di HTTP richiedere intenti non ha nulla a che fare con gli errori di input utente normale e convalida. Nelle mie applicazioni, una richiesta HTTP deve essere valida nei cinque modi sopra indicati per onorarla. In un modo di difesa approfondito , non si arriva mai alla convalida dell'input dell'utente sul lato server se una di queste cinque cose fallisce.
Sì, questo significa che anche l'input di file deve essere conforme ai tuoi tentativi di front-end per verificare e comunicare all'utente la dimensione massima del file accettata. Solo HTML? Nessun JavaScript? Bene, ma l'utente deve essere informato delle conseguenze del caricamento di file troppo grandi (principalmente, che perderanno tutti i dati del modulo e verranno espulsi dal sistema).
4) Ciò significa che i dati di input della richiesta HTTP non fanno parte della logica aziendale dell'applicazione? No, significa solo che i computer sono dispositivi limitati e che le risorse devono essere utilizzate con saggezza. Ha senso interrompere l'attività dannosa prima, non dopo. Paghi di più in risorse di calcolo per aspettare di fermarlo in seguito.
5) Se l' input della richiesta HTTP è errato, l'intera richiesta è errata . È così che lo guardo. La definizione di un buon input di richiesta HTTP deriva dai requisiti aziendali del modello, ma deve esserci un certo punto di demarcazione delle risorse. Per quanto tempo lascerai vivere una cattiva richiesta prima di ucciderla e dire: "Oh, ehi, non importa. Cattiva richiesta."
Il giudizio non è semplicemente che l'utente ha commesso un errore di input ragionevole, ma che una richiesta HTTP è così fuori limite che deve essere dichiarata dannosa e interrotta immediatamente.
6) Quindi, per i miei soldi, la richiesta HTTP (METODO, URL / percorso e dati) è TUTTA buona, oppure NIENTE può procedere. Un modello robusto ha già compiti di convalida di cui occuparsi, ma un buon pastore di risorse dice "La mia strada, o la strada più alta. Vieni, corretto o non venire affatto".
È il tuo programma, però. "C'è più di un modo per farlo." Alcuni modi costano di più in termini di tempo e denaro rispetto ad altri. La convalida dei dati delle richieste HTTP in un secondo momento (nel modello) dovrebbe costare di più nel corso della vita di un'applicazione (soprattutto se il ridimensionamento o il ridimensionamento).
Se i tuoi validatori sono modulari, la convalida dell'input di richiesta * HTTP di base ** nel controller non dovrebbe essere un problema. Usa solo una classe di convalida strategica, in cui i validatori sono talvolta composti anche da validatori specializzati (e-mail, telefono, token di modulo, captcha, ...).
Alcuni lo vedono come completamente sbagliato, ma HTTP era agli inizi quando la Gang of Four scrisse Design Patterns: Elements of Re-usable Object-Oriented Software .
================================================== ========================
Ora, per quanto riguarda la normale convalida dell'input dell'utente (dopo che la richiesta HTTP è stata considerata valida), sta aggiornando la vista quando l'utente incasina a cui devi pensare! Questo tipo di convalida dell'input dell'utente dovrebbe avvenire nel modello.
Non hai alcuna garanzia di JavaScript sul front-end. Ciò significa che non è possibile garantire l'aggiornamento asincrono dell'interfaccia utente dell'applicazione con stati di errore. Il vero miglioramento progressivo coprirebbe anche il caso d'uso sincrono.
La contabilità per il caso d'uso sincrono è un'arte che si perde sempre più perché alcune persone non vogliono passare attraverso il tempo e il fastidio di tracciare lo stato di tutti i loro trucchi dell'interfaccia utente (mostra / nascondi controlli, disabilita / abilita i controlli , indicazioni di errore, messaggi di errore) sul back-end (in genere monitorando lo stato negli array).
Aggiornamento : Nel diagramma, dico che View
dovrebbe fare riferimento a Model
. No. Dovresti trasmettere i dati al View
da Model
per preservare l'accoppiamento lento.