2010-08-24 49 views
5

Estoy trabajando en la creación de mi MVC muy simple y estoy pensando en maneras de pasar del controlador a la vista. Lo que implica enviar variables de una clase a una simple página PHP antigua.Yendo desde el controlador a la vista

Estoy seguro de que esto se ha cubierto antes, pero quería ver qué tipo de ideas podrían surgir.

//this file would be /controller/my_controller.php 

class My_Controller{ 

    function someFunction(){ 

    $var = 'Hello World'; 
    //how do we get var to our view file in the document root? 
    //cool_view.php 

    } 

} 

Respuesta

1

Algún tipo de hashtable es una buena forma de hacerlo. Devuelve tus variables como array de asociación que llenará todos los huecos en tu vista.

+0

Así que se recomienda simplemente devolver las variables en el controlador. Y luego en la vista decir $ vars = new my_controller(); y luego usa la función apropiada. Esa es una buena solución fácil de hecho. – Mike

1

tienda variables como una propiedad en su objeto controlador, luego extraerlos cuando se representa

class My_Controller { 

    protected $locals = array(); 

    function index() { 
     $this->locals['var'] = 'Hello World'; 
    } 

    protected function render() { 
     ob_start(); 
     extract($this->locals); 
     include 'YOUR_VIEW_FILE.php'; 
     return ob_get_clean(); 
    } 
} 

Se pueden definir los métodos y __get __set mágicas para que sea más bonita

$this->var = 'test'; 
+0

Tenga mucho cuidado con 'extract', lea cuidadosamente antes de usar http://ru2.php.net/manual/en/function.extract.php – Kirzilla

1

estoy también el desarrollo de mi propia MVC simple y la most simple way de hacerlo es ...

class My_Controller 
{ 

    function someFunction() { 
     $view_vars['name'] = 'John'; 
     $view = new View('template_filename.php', $view_vars); 
    } 

} 
Ver

clase

class View 
{ 
    public function __construct($template, $vars) { 
     include($template); 
    } 
} 

template_filename.php

Hello, <?php echo $vars['name'];?> 

le recomiendo a echar un vistazo a PHP Savant http://phpsavant.com/docs/

0

creé mi propia MVC para el curso libre PHP Estoy realizando para un puñado de personas que quieren mejorar en PHP.

De lejos, la mejor manera de hacerlo es usar el patrón Command + Factory.

E.g.

interface ControllerCommand 
{ 
    public function execute($action); 
} 

En cada controlador:

class UserController implements ControllerCommand 
{ 
    public function execute($action) 
    { 
     if ($action == 'login') 
     { 
      $data['view_file'] = 'views/home.tpl.php'; 
     } 
     else if ($action == 'edit_profile') 
     { 
      $data['view_file'] = 'views/profile.tpl.php'; 
      $data['registration_status'] = $this->editProfile(); 
     } 

     return $data; 
    } 
} 

Desde su controlador frontal principal:

$data = ControllerCommandFactory::execute($action); 
if (!is_null($data)) { extract($data); } 
/* We know the view_file is safe, since we explicitly set it above. */ 
require $view_file; 

El punto es que cada clase Controllercommand tiene una función de ejecutar y que devuelve su punto de vista y cualquier dato para esa vista.

Para obtener el MVC completo, puede acceder a la aplicación de código abierto enviándome un correo electrónico a theodore [at] phpexperts.pro.

1

Compré Zend_View y cómo se realizó la visualización.

Usted puede obtener la fuente de View y AbstractView en github - unfortunaly no encuentro el repositorio actual (en SVN) tan fácil de navegar.

Esencialmente las variables de la vista están contenidos en un objeto View (que su controlador tendría acceso a), entonces la plantilla (el viejo y simple documento php) se hace dentro de ese objeto.Ese método permite que la plantilla tenga acceso al $this.

Sería algo así como:

<?php 
class View 
{ 
    public function render() 
    { 
    ob_start(); 
    include($this->_viewTemplate); //the included file can now access $this 
    return ob_get_clean(); 
    } 
} 
?> 

Así que en su controlador:

<?php 
class Controller 
{ 
    public function someAction() 
    { 
    $this->view->something = 'somevalue'; 
    } 
} 
?> 

Y su plantilla:

<p><?php echo $this->something;?></p> 

En mi opinión, este patrón que permite una gran flexibilidad con la vista.

Cuestiones relacionadas