2011-09-07 13 views
5

Estoy trabajando en la construcción de un MVC liviano, principalmente para el proceso de aprendizaje, pero me gustaría que sea lo suficientemente bueno para usarlo eventualmente.Cómo cargar el modelo en un controlador en MVC

A continuación se muestra un ejemplo/demo básico de cómo se vería un controlador básico, supongamos que el URI se ha procesado y enrutado a este controlador y estos 2 métodos.

1) Necesito obtener datos de la base de datos/caché/etc ... dentro de mis clases de modelos, solo necesito ayuda sobre cómo debo cargar mis modelos en mi controlador de ejemplo a continuación, puedes ver que he agregado esto debajo de $profileData = $this->model->getProfile($userId) que está hecho y no existe, ¿cómo podría conseguir algo así para trabajar? ¿O debería cargar el modelo en la clase de una manera diferente?

2) Muchas páginas requieren que el usuario inicie sesión en el sitio. Debería procesar la parte siguiente en el controlador para verificar si un usuario está conectado, por ejemplo, antes de crear la página de perfil, verificar si el usuario está conectado, si no, crear una página de inicio de sesión y agregar estas verificaciones dentro de cada método de controlador /¿página?

/** 
* 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); 
    } 
} 

núcleo

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

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


    } 
} 

Respuesta

2

Probablemente hay un montón de maneras de lograr lo que está tratando.

El "más fácil" es probablemente anular el constructor y crear una instancia del modelo directamente.

en User_Controller:

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

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

supongo que usted está buscando algo un poco más automatizado sin embargo. Si desea que el Modelo tenga el mismo nombre que el controlador menos "_Controller", simplemente use get_class ($ this) en el constructor y use las funciones de cadena de PHP para analizar lo que desea. Una vez conseguido eso en una variable, puede utilizar esa variable para crear una instancia del modelo:

en 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(); 
} 

En realidad no he trabajado con cualquier marco que sólo puede tener un modelo asociado a cada controlador (excepto CakePHP? No lo recuerdo). Con Symfony, los modelos y controladores están completamente desacoplados para que pueda usar cualquier modelo con cualquier controlador. Simplemente crea una instancia del modelo como necesario. Symfony utiliza el ORM de Doctrine así por ejemplo, en una acción del controlador, si se necesita un modelo que podría hacer algo como esto:

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

que valdría la pena considerar un diseño más bien que con el fin de promover una desacoplado diseño y yo prometo que querrá más de un modelo en algún controlador en algún momento.

2.) En cuanto a la autenticación. Algo que parece ser bastante común es tener algún tipo de ajuste (ya sea en un archivo de configuración o una variable de miembro) que indique si la acción actual necesita que el usuario sea autenticado o no. Esto se procesa cada vez que se ejecuta la acción (Yii llama filtros de este tipo de cosas). Si el usuario necesita iniciar sesión, almacena la página a la que intenta acceder y luego la redirecciona a una página de inicio de sesión (solo debe crear una). Una vez que se autentiquen correctamente, los redireccionará a donde originalmente se dirigían.

+0

Gracias por las ideas, y tiene razón, algunos controladores probablemente necesitarán más de un modelo, especialmente cuando construyan un sitio de tipo red social. – JasonDavis

+0

Sí, otra desventaja del ejemplo anterior es que * siempre * crea una instancia del modelo aunque no lo necesite. Probablemente no sea un gran problema, pero vale la pena señalar que puede estar haciendo un trabajo adicional en algunas solicitudes. – gregghz

Cuestiones relacionadas