Dopo molte ore di ricerca e di riflessione ho trovato una comprensione, quindi sono venuta a interrogarla di nuovo, sto lottando per trovare qualcosa di concreto che riesco a cogliere e applicare al mio codice in senso pratico, andando avanti.
Penso che mi riferisca alla logica di presentazione e a un modello di dominio . Ho letto numerosi articoli come Modello di dominio anemico , ma non riesco ancora a capire quale sia la soluzione corretta . Inizierò con uno scenario reale che mi sta sconcertando.
Diciamo che ho un modulo web che richiede che i dati siano mostrati da 10 diversi modelli. Da ogni modello ho bisogno di ottenere un insieme specifico di dati che è utile solo a questa particolare vista. Ad esempio, potrebbe trattarsi di un gruppo di menu a discesa con determinate opzioni al loro interno.
1. Lascia che sia il controller a farlo
Pseudo codice:
/**
* Controller action
*
* Process a request for the specific view.
*/
public function myView()
{
$options1 = $model1->query(
// Get fields A, B, C from the database
// Order the data by a certain field
// Exclude data which does not meet conditions
// Process the data some more
);
$options2 = $model2->query(
// Get fields X, Y, Z from the database
// Order the data by a certain field
// Exclude data which does not meet conditions
// Process the data some more
);
// ...repeat this sort of thing 8 more times
$this->sendToView($options1, $options2, ...);
}
Quindi il controllore richiede a entità di modello diverse i dati necessari per la visualizzazione, esattamente nel formato richiesto dalla vista.
In un certo senso, questo mi sembra carino perché il livello del modello non ha idea della vista, e il controllore si assume la responsabilità di colmare il divario tra di loro. Tutta la logica su ciò che dovrebbe essere presentato nella vista è gestita dall'unico metodo nell'applicazione direttamente accoppiato a quella vista.
Tuttavia, questo potrebbe facilmente essere 200 linee nel mio controller, e questo è solo per la vista specifica one . Presto tutti i controller saranno enormi caos disordinati di dozzine di chiamate ai modelli per dati specifici per ogni vista. Puoi dividere le diverse chiamate in altri metodi sul controller (ad esempio privato) per renderlo un po 'più modulare / gestibile, ma qual è il punto?
Conclusione: mantenere il controller sottile e delegare questa roba altrove, suppongo.
2. Lascia che sia il livello Model a farlo
Pseudo codice:
/**
* Controller action
*
* Process a request for the specific view.
*/
public function myView()
{
$options1 = $model1->getOptionsForAbc();
$options2 = $model2->getOptionsForXyz();
// ...repeat for 8 more models
}
/**
* Model 1
*/
public function getOptionsForAbc()
{
$options = $this->query(
// Get fields A, B, C from an associated table
// Order the data by a certain field
// Exclude data which does not meet conditions
);
return $options;
}
// Each model has similar methods which retrieve specific sets of data
Quindi ora il controller è bello e sottile e non si occupa di alcuna logica. Richiede solo il modello per alcune cose di cui ha bisogno e il modello sa come ottenerlo.
Uso il termine "modello" liberamente qui. Capisco perfettamente che il modello è un livello composto da molte cose.
Il problema con questo sembra essere che i modelli finiranno per avere molte funzionalità che probabilmente sono utili solo per una vista particolare. Non sarà usato altrove perché solo quella vista richiede quel particolare sottoinsieme di dati. Questo mi sembra non corretto.
3. Implementa un livello di servizio / business logic
Credo che tutta la logica aziendale dovrebbe essere nel modello. Per la normale logica aziendale, come i calcoli, la convalida e altre cose che capita ai dati, lo capisco.
Tuttavia, che cosa dovrebbe accadere con questo particolare esempio di una vista che richiede dati specifici? Dovrei creare una classe di servizio che rappresenta il modulo, che è in grado di fornire tutti i dati richiesti dalla visualizzazione, nel formato corretto? Non sembra giusto.
Domanda finale: Quindi dove dovrei sto memorizzando questo tipo di logica di presentazione relativa ai dati che è solo per la vista?