代码之家  ›  专栏  ›  技术社区  ›  Mike

从控制器到视图

  •  5
  • Mike  · 技术社区  · 15 年前

    我正在努力创建我自己的非常简单的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 回复  |  直到 15 年前
        1
  •  1
  •   Łukasz W.    15 年前

    某种哈希表是一种很好的方法。以关联数组的形式返回变量,它将填补视图中的所有空白。

        2
  •  1
  •   Sean Huber    15 年前

    将变量作为属性存储在控制器对象中,然后在渲染时提取它们

    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';
    
        3
  •  1
  •   Kirzilla    15 年前

    我还在开发自己的简单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);
       }
    }
    

    模板文件名。php

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

    我强烈建议您看看PHP Savant http://phpsavant.com/docs/

        4
  •  1
  •   Tim Lytle    15 年前

    我想结账 Zend_View 以及它是如何实现视图渲染的。

    你可以找到 View AbstractView 在github上——不幸的是,我没有发现当前的存储库(在svn中)那么容易浏览。

    基本上,视图变量包含在 看法 对象(您的控制器将有权访问该对象),然后在该对象内呈现模板(普通的旧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>
    

    在我看来,这种模式允许你在视图上有很大的灵活性。

        5
  •  0
  •   Theodore R. Smith    15 年前

    我为免费的PHP课程创建了自己的MVC,我正在为少数希望在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发送电子邮件来访问开源应用程序。赞成的意见。

    推荐文章