IMO ...
MVC è un design pattern molto generico che non necessariamente dire ciò che è bene e cosa è male. C'è un modello, una vista e un controller. Le responsabilità di ciascuna di queste cose dipendono dal sapore di MVC e il sapore di MVC che scegli dipende dalla complessità del tuo progetto. Ad esempio, se si dispone di un progetto basato sul dominio, gli esempi forniti da altri qui non funzionerebbero molto bene.
Così alla sua base stessa:
Modello: Un oggetto che ha i dati che verranno visualizzati nella vista. Che si tratti di un DTO o di un modello di dominio non è in realtà definito qui, ma condividerò i miei pensieri su questo in un secondo.
Visualizza: è ciò che l'utente vede e il modo in cui l'utente interagisce. Qualsiasi codice o logica qui dovrebbe supportare direttamente la vista. In altre parole logica aziendale ZERO, logica di accesso ai dati ZERO, conoscenza ZERO di tutto ciò che va oltre ciò che l'utente vede fisicamente. O un modulo Web, un modulo finestra desktop o un'attività (mobile) ecc ...
Controller: Probabilmente il pezzo più ambiguo di questo puzzle. Una cosa è certa, media tra la vista e il "modello" e decide anche cosa succederà dopo o meglio, "controlla" il flusso. Ma è importante non portare questa descrizione troppo lontano. Ciò che questa cosa dipende in realtà dipende dalla tua comprensione di MVC. Quindi condividerò il modo in cui lo guardo in un contesto web; ma fondamentalmente, basta tracciare una linea tra il controllo del flusso del servizio e l'esecuzione effettiva del servizio.
MVC, per me, non è un modo diverso di descrivere l'N-livello, come qualcuno potrebbe affermare. Non ci sono livelli in MVC come MVC è effettivamente nel livello di presentazione. Ogni elemento di MVC in realtà vive nel livello di presentazione e il pattern MVC dice solo che si dovrebbe separato le preoccupazioni tra ottenere i dati e la visualizzazione:
- Modello: ciò che i dati assomiglia. Davvero solo una struttura che la vista utilizzerà per ottenere i suoi dati
- Visualizza: Visualizzazione effettiva
- Controller: Calcolare dove ottenere i dati per il modello o anche il modello stesso.
Se si può accettare questa affermazione, allora dovrebbe aiutare a chiarire cosa sia realmente il modello in questo contesto. Il modello NON è un oggetto di accesso ai dati e il modello NON è un modello di dominio perché nessuna di queste cose dovrebbe essere nel livello di presentazione. Quindi questo ci lascia con un ViewModel (MVVM) o un DTO. Ho intenzione di andare con DTO per motivi di semplicità.
Quindi, se abbiamo accettato DTO come tipo di modello di cui stiamo parlando quando diciamo "modello" in MVC, allora dove lo otteniamo? Se il controller non deve interferire con l'accesso ai dati, allora dove? E il tuo livello di servizio? Il tuo livello di servizio contiene tutti i "come" della tua applicazione. È il livello "Fai cose". Quindi, se la tua vista vuole creare un utente, raccoglierà i dati e li consegnerà al controller. Il controllore decide quali servizi chiamare per eseguire l'attività e invia la richiesta con i dati necessari. Il livello di servizio risponde con un DTO. Tale DTO può essere utilizzato direttamente o aggiunto a un altro modello (se sono stati chiamati più servizi, ad esempio).
I punti importanti sono:
- Il controllore non sa nulla del tuo dominio (se ne avete uno), si conosce solo sui propri servizi disponibili e come chiamarli.
- Assolutamente no business la logica viene eseguita dal controller. Ad esempio, se è necessario inviare un'e-mail di benvenuto come parte dell'operazione CreateUser, quella non verrà avviata dal controller poiché si tratta tecnicamente di una regola aziendale. Sarebbe gestito tra il tuo servizio e i livelli del dominio.
- A mio parere, nessun accesso ai dati deve essere eseguito dal controller. Questo dovrebbe essere delegato a un livello di servizio. Molte esercitazioni tendono a mostrare il controller che interagisce con i repository che, a mio avviso, va bene perché si tratta di un'astrazione, ma l'accesso diretto ai dati dovrebbe essere un assoluto no no ovunque nel livello di presentazione.
Ancora, questo in un contesto web. Se stai lavorando con MVC in un'app per Android, forse non avrai un livello di servizio o un dominio. Forse interagirai con una diversa razza di oggetti. Personalmente, utilizzo sempre i livelli di servizio o applicazione e per diversi motivi che possono o non possono essere considerati preziosi per gli altri.
Quindi in MVC.Net, il controller è più simile a un'API; la vista e l'API sono due diversi media di presentazione che hanno lo scopo di funzionare insieme (il controller back-end presenta i dati, il frontend controller crea modelli con tali dati e media con la vista). In Angular, il controller è più simile a ciò di cui stiamo parlando qui. Strati di strati di strati, a quanto pare. È un po 'confuso concettualizzare, ma il concetto non si sposta mai oltre il livello di presentazione.
Ma per riassumere: Il controller "controlla" le operazioni e i dati in entrata e in uscita dal sistema, da e verso la vista ma in realtà NON FARE l'attività. I dettagli di questo processo dipendono in larga misura dalla filosofia di progettazione del progetto.
Quindi, qui, in questo schema, ho raggruppati i concetti di mostrare MVC all'interno di N-tier in una tipica applicazione monolitica. La comunicazione va da sinistra a destra e non passa sopra nessun altro livello (vedi: Architettura di cipolla). Nel livello di presentazione, il controller conosce il modello e la vista ma la vista e il modello non conoscono nulla per la maggior parte. Tuttavia, in molte versioni di MVC, tra cui ASP.Net e MVVM, la vista potrebbe conoscere l'interfaccia del modello o il prototipo (ma non l'istanza del modello) in modo che possa collegarsi ad esso.
Il controller gestirà la manipolazione del modello (o visualizza il modello in questo contesto), il che significa che potrebbe essere necessario conoscere l'oggetto dominio ei servizi di dominio. È possibile inserire facoltativamente un livello applicazione tra il livello di presentazione e il dominio se si desidera un'applicazione più riutilizzabile (ad esempio, l'applicazione potrebbe avere più teste: un'API Web e un'app desktop e un'app mobile, ecc.) Per fornire un confine transazionale e ulteriore isolamento. È importante che la vista non abbia alcuna conoscenza/dipendenza dagli oggetti di dominio in questa architettura: ecco perché esiste un modello separato per la vista. Il punto del modello in MVC è di creare un modello per la vista. Cioè, è un modello appositamente progettato per servire la vista, NON il dominio. Va bene che il modello di visualizzazione avvolga/adatta il modello di dominio a condizione che non venga mai esposto pubblicamente e/o accidentalmente serializzato.
In una nota a margine, il "livello di presentazione" in un'API Web, a mio parere, è il contratto serializzato (ad esempio JSON o XML). Quindi trattalo di conseguenza.
Hmm ... un po 'difficile per il mio cervello non così buono da capirlo! :( Accetto che il mio esempio sia banale e non ci sia realmente bisogno di controller in esso, ma suppongo che se codifico la stessa cosa con CakePHP sarebbe obbligatorio per me creare un controller Potete aiutarmi per aggiungere un controller.php al mio codice, va bene anche se non fa nulla di utile, voglio solo capire come i controller comunicano con i modelli e le viste – Cracker
Non conosco CakePHP, quindi non posso aiutarti su questo Il mio suggerimento è il seguente: dividere il modello (gestione dei dati) dalla vista (presentazione) Quando la vista diventa troppo grande, isolare in un altro oggetto/file PHP tutto ciò che non ha nulla a che fare con la rappresentazione visiva –
No. I am Non sto parlando di CakePHP, sto parlando di aggiungere controller.php al mio codice PHP menzionato sopra. – Cracker