Logica e valori nella vista o nel controller

4

Ho un'applicazione costruita usando un framework MVC (per ragioni di argomento, PHP / Yii2) e ho una domanda su dove portare avanti la logica e generare valori che verranno iniettati in, per esempio, IndexView o AboutUsView .

In questo caso la pagina "Chi siamo" viene visualizzata quando la rotta /about-us viene colpita da un browser, chiamando il metodo actionAboutUs in SiteController che chiama semplicemente il metodo Controller::render($template) che causa il $template php file da analizzare e produrre.

Questo va bene quando il contenuto di $template non è dinamico in alcun modo; solo contenuto html statico. Tuttavia, quando dovrebbe esserci del contenuto dinamico, la mia comprensione di MVC è che questo dovrebbe essere calcolato nel controller e passato al metodo render .

Essere veramente MVC è corretto e se è così una regola dura e veloce?

Ad esempio, in una pagina mi piacerebbe produrre il numero di post che un metodo di classe Post::getNumberPosts() potrebbe essere chiamato direttamente nella vista e in uscita o chiamato nel controller, assegnato a una variabile, la variabile iniettata in alla vista e al valore dell'output variabile. Il primo metodo va contro MVC come pattern?

O se sulla homepage mi piacerebbe produrre uno di due messaggi diversi a seconda dello stato di accesso dell'utente corrente. Se l'utente non ha effettuato il login in un messaggio di benvenuto generico o se ha effettuato l'accesso, chiama altri metodi per generare contenuti specifici dell'utente. Al momento questo viene gestito nella vista nel modo seguente

 <?php if (!App::loggedIn) { ?>
    <p>Generic Welcome!</p>
 <?php } else {
    $myVar = currentUser->getDetails();
 ?>
    <p>hello <?php echo $myVar->myName;?></p>
 <?php } ?>

Questo caso potrebbe essere gestito in un modo più MVC?

tl; dr Tutta la logica nel controller e passa alla vista?

    
posta Pedro del Sol 10.03.2016 - 13:14
fonte

2 risposte

7

In primo luogo, la tua Vista certamente non dovrebbe contenere logica aziendale / applicativa. La sua responsabilità è per il layout, l'aspetto e la presentazione dei dati. Ogni volta che vieni vicino a pensare "Hm, dovrei aggiungere un'istruzione if nel mio View?" la risposta corretta (per quanto riguarda MVC) è No! .

In secondo luogo, il controller in realtà non dovrebbe contenere logica aziendale / applicativa, perché la sua responsabilità dovrebbe essere limitata a fungere da "collante" che serve la vista dopo una richiesta in entrata da parte dell'utente.

Il posto migliore per la logica di business tende ad essere nel modello (che è molto più simile a un ViewModel che a un modello ORM).

Lo stesso pattern MVC non intende coprire la struttura della logica dell'applicazione; quella logica potrebbe essere suddivisa in più livelli (inclusi modelli, ViewModels e altre cose), ma MVC è un pattern dell'interfaccia utente, e non un modello per descrivere l'architettura completa dell'applicazione.

Tutto ciò che non è correlato all'interattività dell'utente (come la logica aziendale) è generalmente raggruppato sotto l'ombrello approssimativamente noto come "Modello" per quanto riguarda MVC.

    
risposta data 10.03.2016 - 13:39
fonte
0

Come Ben ha già descritto, la vista dovrebbe essere più o meno stupida. Idealmente, nessuna logica dovrebbe essere qui. Per supportare meglio questo approch si è evoluto un proprio sistema di template chiamato Moustache . È implementato in molti linguaggi di programmazione. Trova maggiori informazioni qui:

link

link

La creazione diretta di viste con PHP (e Yii2) ti consente di fare tutto ciò che è possibile in PHP. Questo può portare a file di visualizzazione non così puliti, ma onestamente, questo rende la vita quotidiana a volte un po 'più semplice.

    
risposta data 03.03.2017 - 10:18
fonte

Leggi altre domande sui tag