Come passi i valori tra le pagine PHP per MVC?

In che modo i programmi PHP passano i valori tra il model, la vista e le pagine del controller? Ad esempio, se un controller aveva un arrays, come lo passa alla vista?

MODIFICARE:

Grazie alle tue risposte. Vedo un paio di loro affermando che i componenti si trovano nella stessa pagina, ma quando guardo qualcosa come CodeIgniter, vedo tre pagine PHP separate per model, vista e controller.

Di solito il controller crea un object vista e quando crea quell'object vista passa le informazioni.

<?php class Controller { public function __construct() { $arr = arrays("a","b","c"); $myView = new View($arr); } } class View { private $content; public function __construct($content) { $this->content = $content; include_once('myPage.inc.html'); } } ?> 

CodeIgniter, come la maggior parte dei framework PHP MVC, viene fornito con un "motore" di View. In altre parole, esiste una class nella struttura responsabile del caricamento e del trasferimento dei dati dal controller alla vista.

Specifico per CodeIgniter, quelle chiamate hanno questo aspetto:

 $data = arrays( 'title' => 'My Title', 'heading' => 'My Heading', 'message' => 'My Message' ); $this->load->view('blogview', $data); 

La tua vista sarebbe quindi una pagina php separata, in questo caso blogview.php . Potrebbe assomigliare a questo:

 <html> <head><title><?= $title ?></title></head> <body> <h2><?= $heading ?></h2> <p><?= $message ?></p> </body> </html> 

La parte responsabile del trasferimento dei dati tra il controller e la vista è il motore di visualizzazione (o class) interno a CodeIgniter. Prende quell'arrays dal controller e lo deserializza per la vista.

Allora perché due file separati? Il paradigma MVC è tale che, in base alla progettazione, desideri separare la logica aziendale dall'interface utente. Non è necessario incorporare la parte Modello di MVC se non si sta facendo molto con un database. Ma è lì quando vuoi separare ulteriormente le porzioni di accesso ai dati del tuo codice dalla tua logica di business (la roba che manipola i dati per l'utente). In tal caso, hai i tuoi 3 file separati; model, controller, vista.

Quindi no, i componenti non sono tutti nella stessa pagina, anche se potrebbero certamente esserlo. Ma strutturando il tuo programma usando MVC, puoi separare le operazioni della tua applicazione in modo pulito e ordinato. In questo modo, puoi lavorare su un livello alla volta senza influenzare gli altri livelli. Il tuo ragazzo CSS potrebbe rendere il sito bello mentre ti rendi conto del motivo per cui l'utente non può accedere, per esempio.

Spero che Johnny abbia trovato da tempo la risposta che sto cercando, ma posso fornire una panoramica su come farlo in modo insoddisfacente! È ansible passare da una informazione da un file (ad esempio un componente "vista" che raccoglie i dati immessi dall'utente di un sito) a un altro file (ad esempio un componente "model" che verifica / validation i dati del module e lo rispedisce al module per la revisione o lo memorizza in un database). I valori del module possono essere inviati tramite gli arrays POST o GET e l'attributo 'action' determina quale file riceve i dati ad es

 <form action = 'form-exec.php' method = 'POST'> ---some set of possible user inputs goes here <input name='submit' type='submit' value='Go'> </form> 

Dopo l'elaborazione, è ansible che si desideri restituire alcuni dati nel module, ad esempio i valori di input dell'utente che devono essere modificati o un messaggio di successo. È ansible memorizzare tali dati nelle variables di session e recuperarli da tali variables nella pagina 'Visualizza'. Quindi, come si torna alla pagina 'Visualizza'? Ora, sono qui perché ho visto questo usato e l'ho usato da solo, ma ero piuttosto inorridito nel leggere che, a quanto pare, il trasferimento passa attraverso una richiesta http di internet lenta cane – anche quando il trasferimento è in un file nello stesso directory sul server! Ok, quindi il modo UNSATISFACTORY per tornare al tuo componente 'view' è un paio di linee PHP come questa:

 header("location: theinputform.php"); exit; 

Funziona, ma ci deve essere un modo migliore, sicuramente? Ho visto un 'rant' da qualcuno che diceva che dovresti semplicemente usare un inclusivo, ma non riesco a capire come fare la cosa ragionevolmente quotidiana di tornare all'inizio di una pagina e ricrearla secondo le nuove condizioni. Ad esempio, se ho appena registrato un utente in I non voglio mostrare un invito per accedere questa volta. Include il gioco da ragazzi per aggiungere AGGIUNTAMENTE qualcosa a una pagina, ma non ho trovato un modo migliore per tornare semplicemente all'inizio di quanto sopra. Qualcuno ha qualche intuizione o conoscenza su questo? Come afferma l'OP, Johnny e io vogliamo fare lo stesso come un MVC ma non stiamo utilizzando un framework MVC di alcun tipo. Ci sono diversi libri ed esercitazioni là fuori che usano semplicemente il metodo "headers" sopra, btw.

Ok, modifica: ottieni da un module (ad esempio una pagina di "visualizzazione") l'elaborazione del module utilizzando l'attributo "azione" del module, come sopra. Se la pagina 'model' non emette html e solo 'fa le cose', puoi semplicemente includere la pagina 'vista' che vuoi andare (o tornare a) al completamento. Penso di sì, comunque! Sto per provarlo …

Ho faticato con questa domanda me stesso. Sono tornato alla programmazione php dopo quasi un decennio. Mi sono imbattuto in un paio di problemi con l'implementazione di framework PHP MVC in un server sperimentale, quindi ho finito per build una semplice variante MVC.

Nel mio design semplice (frontale) il controller interagisce con il model per popolare un object payload e lo passa alla vista. Ogni vista è implementata in un file PHP separato, così gli usi del controller includono , per "caricare" la vista desiderata. La vista quindi può accedere ai dati tramite il nome designato ($ dataId) per l'object payload.

 class Controller { public $model; ... public function display($viewId,$dataId,$data) { $url = $this->getViewURL($viewId); $this->loadView($url,$dataId,$data); } public function getViewURL($key) { $url = 'view/list_view.php'; if($key == 'create') { $url = 'view/create_view.php'; } else if($key == 'delete') { $url = 'view/delete_view.php'; } return $url; } public function loadView($url,$variable_name, $data) { $$variable_name = $data; include $url; } } 

model, vista e controller non sono pagine separate ma una pagina.
Quindi, non c'è bisogno di "passare" nulla

Puoi usare un motore di template come smarty per separare le viste da controller e templates.

e passa le variables al tuo model usando, ad esempio, il metodo assign di smarty.