Переход от контроллера к представлению - PullRequest
5 голосов
/ 25 августа 2010

Я работаю над созданием собственного очень простого 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

   }

}

Ответы [ 5 ]

1 голос
/ 25 августа 2010

Я бы оформил заказ 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>

В моемМнение о том, что этот шаблон дает вам большую гибкость при взгляде.

1 голос
/ 25 августа 2010

Сохраните ваши переменные как свойство в вашем объекте контроллера, затем извлеките их при рендеринге

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';
1 голос
/ 25 августа 2010

Я также разрабатываю свой собственный простой 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/

1 голос
/ 25 августа 2010

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

0 голосов
/ 25 августа 2010

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

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

Например:

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 имеет функцию execute, которая возвращает свое представление и любые данные для этого представления.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...