2009-02-24 8 views
7

Ho una domanda che si applica realmente a qualsiasi framework MVC, sto utilizzando Zend Framework MVC.Come dovresti nominare il controller in MVC? Quando dovresti crearne uno nuovo?

Quando esattamente si dovrebbe creare un nuovo controller? Cosa dovrebbe definire esattamente il layer Controller?

Ho creato diverse app con MVC, diventando progressivamente più riutilizzabile, ma ho sempre avuto difficoltà a nominare le classi Controller. Per la maggior parte corrisponde a qualunque richiesta URL ci sia, quindi logica business/front end. Ma in alcuni casi sembra totalmente arbitrario.

Qualcuno ha delle euristiche/linee guida da seguire? Sembra che con tutto il clamore su MVC, in particolare con PHP, ci sono pochi dati su convenzioni effettive ed euristiche. Come è abbastanza facile creare un'applicazione MVC disorganizzata ...

risposta

7

Generalmente ho un controller per ciascun gruppo logico di funzioni. Spesso questo corrisponde a un controller per modello, a volte no.

Immaginate di creare un semplice catalogo online che visualizza un elenco di categorie, quindi quando l'utente seleziona una categoria, visualizza un elenco di prodotti da tale categoria, insieme a un pannello di amministrazione per le operazioni CRUD su categorie e prodotti. Avrei due modelli (CategoryModel e ProductModel). Avrei un controller che ha generato gli elenchi di categorie per il front-end e un altro controller che ha generato le schede di prodotto (ad esempio CategoryController e ProductController). Avrei quindi un controller per categorie e prodotti sul back-end (AdminCategoryController e AdminProductController). I due controller back-end gestiscono le operazioni di lista/aggiungi/modifica/cancellazione/visualizzazione per i rispettivi modelli. Se pensi che la struttura dell'URL e le relative funzioni siano associate agli URL correlati, la struttura del tuo controller corrisponderà spesso alla struttura dell'URL. In effetti alcuni framework (ad esempio CodeIgniter) instradano le richieste in base al nome del controller come comportamento predefinito.

Per quanto riguarda ciò che accade nei controller, lavoro nell'idea che i modelli siano per l'accesso ai dati e avvolgono e nascondono la struttura del database. Logica come "assegna l'ora attuale a completion_date quando lo stato è impostato su" completo "" è un ottimo modello di adattamento.

Le viste contengono l'interezza della presentazione. I controller/i modelli non devono generare o gestire l'HTML. Decisioni come 2 colonne o 3 appartengono alle viste. La logica di visualizzazione dovrebbe essere limitata a quella necessaria per generare l'output visibile. Se ti accorgi di voler interrogare il database da una vista, probabilmente stai mettendo troppa logica nella vista.

I controller sono per ciò che è rimasto. In genere ciò significa convalidare l'input, assegnare i dati del modulo ai modelli, selezionare le viste corrette e creare un'istanza dei modelli necessari per gestire la richiesta.

+0

Grazie .... è più o meno quello che sto facendo. Una cosa che sto cercando di fare è mettere più logica nel livello del modello. Io uso gli oggetti del modello di propel e pensavo che la validazione dovrebbe andare nel livello del modello. Il controller imposta semplicemente i dati nel modello ... – AndreLiem

+1

Alcuni sviluppatori preferiscono inserire tutte le convalide in Modelli. Trovo che la convalida del modulo sia fatta meglio nel Controller (perché è strettamente accoppiata all'interfaccia utente) e la convalida del tipo di dati di base (ad esempio vincolando un campo enum a determinati valori) funziona bene in un modello. –

0

Per la maggior parte seguo il modello controller per modello. Ho alcuni controller che possono servire più modelli (come il controller Admin che serve diversi modelli amministrativi), ma la regola generale è un controller per modello di business.

Problemi correlati