2011-09-07 11 views
5

Sto lavorando sulla costruzione di un MVC leggero, soprattutto per il processo di apprendimento, ma vorrei che fosse abbastanza buono da utilizzare alla fine.Come caricare modello in un controller in MVC

Di seguito è riportato un esempio/demo di base su come potrebbe apparire un controller di base, supponiamo che l'URI sia stato elaborato e instradato verso questo controller e questi 2 metodi.

1) Ho bisogno di ottenere i dati dal database/cache/etc ... dentro le classi del modello, ho solo bisogno di aiuto su come dovrei caricare i miei modelli nel mio esempio controller di sotto, si può vedere che ho aggiunto questo sotto $profileData = $this->model->getProfile($userId) che è appena inventato e non esiste, come potrei ottenere qualcosa del genere per funzionare comunque? O dovrei caricare il modello nella classe in un modo diverso?

2) Un sacco di pagine richiederà all'utente di aver effettuato il login nel sito. Dovrei elaborare quella parte di sotto nel controller per verificare se un utente è connesso, ad esempio, prima di costruire la pagina del profilo, controllare se l'utente è connesso, se non poi costruire una pagina di login, invece, e aggiungere questi controlli all'interno di ciascun metodo di controllo /pagina?

/** 
* Example Controller 
*/ 
class User_Controller extends Core_Controller { 

    // domain.com/user/id-53463463 
    function profile($userId) 
    { 
     //GET data from a Model 
     $profileData = $this->model->getProfile($userId); 

     $this->view->load('userProfile', $profileData); 
    } 

    // domain.com/user/friends/ 
    function friends() 
    { 
     //GET data from a Model 
     $friendsData = $this->model->getFriendlist(); 

     $this->view->load('userFriends', $friendsData); 
    } 
} 

nucleo

abstract class Core_Controller { 
    protected $view; 
    protected $model; 

    function __construct(DependencyContainer $dependencyContainer){ 
     $this->view = new Core_View(); 
     //$this->view = $dependencyContainer->get(view); 


    } 
} 

risposta

2

Probabilmente ci sono tonnellate di modi per ottenere ciò che si sta cercando.

Il "più semplice" è probabilmente per sostituire solo il costruttore e istanziare direttamente il modello.

in User_Controller:

public function __construct(DependencyContainer $dc) { 
    parent::__construct($dc); 

    $this->model = new User_Model(); 
} 

Sto indovinando che siete alla ricerca di qualcosa di un po 'più automatizzato però. Se si desidera che il modello abbia lo stesso nome del controller meno "_Controller", basta usare get_class ($ this) nel costruttore e utilizzare le funzioni di stringa di PHP per analizzare ciò che si desidera. Una volta che avete in una variabile, è possibile utilizzare tale variabile per istanziare il modello:

in Core_Controller:

public function __construct(DependencyContainer $dc) { 
    $this->view = new Core_View(); 

    // $model_class should be 'User_Model' now 
    $model_class = str_replace('_Controller', '_Model', get_class($this)); 

    // now instantiate the model 
    $this->model = new $model_class(); 
} 

Non ho effettivamente lavorato con qualsiasi quadro che può avere un solo modello associato a ciascuna controller (ad eccezione di CakePHP? Non riesco a ricordare). Con Symfony, i modelli e i controller sono completamente disaccoppiati in modo da poter utilizzare qualsiasi modello con qualsiasi controller. Basta istanziare il modello come necessario. Symfony usa la Dottrina ORM così per esempio, in un'azione di controllo, se avete bisogno di un modello che si potrebbe fare qualcosa di simile:

$model = Doctrine::getTable('User'); 

potrebbe essere utile prendere in considerazione un disegno più simile che, al fine di promuovere una disaccoppiato progettazione e io promessa che si vuole più di un modello in qualche controllo a un certo punto.

2.) Per quanto riguarda l'autenticazione. Qualcosa che sembra essere abbastanza comune è avere una sorta di impostazione (sia in un file di configurazione o una variabile membro) che indica se l'azione corrente necessita dell'autenticazione dell'utente. Questo viene elaborato ogni volta che viene eseguita l'azione (Yii chiama questo tipo di filtri per le cose). Se l'utente deve accedere, memorizza la pagina a cui sta tentando di accedere e quindi li reindirizza a una pagina di accesso (dovresti solo doverne crearne uno). Una volta autenticato correttamente, li reindirizzerà verso il punto in cui erano originariamente diretti.

+0

Grazie per le idee, e hai ragione, alcuni controller avranno probabilmente bisogno di più di un modello, soprattutto quando si costruisce un sito di tipo social network. – JasonDavis

+0

sì, un altro svantaggio con l'esempio sopra riportato è che * istanzia * sempre il modello anche quando potresti non averne bisogno. Probabilmente non è un grosso problema, ma vale la pena notare che potresti fare un lavoro extra su alcune richieste. – gregghz

Problemi correlati