从Controller到View

时间:2010-08-24 22:03:14

标签: php model-view-controller

我正在创建自己非常简单的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 个答案:

答案 0 :(得分:1)

某种哈希表是一种很好的方法。将变量作为关联数组返回,这将填充视图中的所有空白。

答案 1 :(得分: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';

答案 2 :(得分: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/

答案 3 :(得分:1)

我会结帐Zend_View以及它如何完成视图渲染。

你可以在github上获得ViewAbstractView的来源 - 不幸的是我找不到易于浏览的当前存储库(在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>

在我看来,这种模式可以让你对视图有很大的灵活性。

答案 4 :(得分:0)

我为免费的PHP课程创建了自己的MVC,我正在为少数想要在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来访问开源应用程序。