2010-08-24 5 views
5

Я работаю над созданием моего собственного очень простого MVC, и я собираю мозговые штурмы, чтобы перейти от контроллера к представлению. Это связано с отправкой переменных из класса на просто старую страницу PHP.Переход от контроллера к виду

Я уверен, что это было рассмотрено ранее, но я хотел посмотреть, какие идеи могут возникнуть у людей.

//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 

    } 

} 

ответ

1

Какая-то хэш-таблица - это хороший способ сделать это. Верните переменные в качестве массива ассоциаций, которые заполнят все пробелы в вашем представлении.

+0

Поэтому вы рекомендуете просто возвращать переменные в контроллере. А затем в представлении скажем $ vars = new my_controller(); а затем используйте соответствующую функцию. Это действительно приятное решение. – Mike

1

Храните переменные как свойства в вашем объекте контроллера, а затем извлечь их при визуализации

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

Вы можете определить эти магические __get и __set методы, чтобы сделать его красивее

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

Будьте очень осторожны с 'extract', внимательно прочитайте перед использованием http://ru2.php.net/manual/en/function.extract.php – Kirzilla

1

Я также разрабатывая мой собственный простой MVC и most simple way, чтобы сделать это ...

class My_Controller 
{ 

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

} 

Посмотреть класс

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

template_filename.php

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

Я настоятельно рекомендую вам взглянуть на PHP Savant http://phpsavant.com/docs/

0

я создал свой собственный MVC для свободного PHP конечно я проводящее для нескольких людей, желающих поправиться на PHP.

Безусловно, лучший способ сделать это - использовать шаблон Command + Factory.

E.g.

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

В каждом контроллере:

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; 
    } 
} 

От основного контроллера передней:

$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; 

Дело в том, что каждый класс Controllercommand имеет функцию выполнения и возвращает его вид и любые данные, для этой точки зрения.

Для получения полного MVC вы можете получить доступ к приложению с открытым исходным кодом, отправив мне по электронной почте theodore [at] phpexperts.pro.

1

Я проверил бы Zend_View и как он выполнил просмотр рендеринга.

Вы можете получить источник View и AbstractView на GitHub - сожелению я не нахожу текущее хранилище (в SVN), которые легко просматривать.

По существу переменные вида содержатся в объекте View (к которому у вашего контроллера будет доступ), тогда шаблон (простой старый документ php) визуализируется внутри этого объекта.Этот метод позволяет шаблону получить доступ к $this.

Было бы что-то вроде:

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

Таким образом, в вашем контроллере:

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

И ваш шаблон:

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

На мой взгляд, эта модель позволяет вам большую гибкость с вид.