DRY MVC视图/控制器分离

时间:2012-06-14 11:55:20

标签: php model-view-controller frameworks dry

我有一个自定义MVC PHP框架,它有一个路由器类,它调用一个控制器,它使用一个模型,然后控制器提供视图等等。

我的问题是我无法从技术上弄清楚如何允许变量在控制器和视图之间传递,从语义上来说。我可以做一个快速而肮脏的修复,但我想要的是控制器:

class IndexController extends Controller{
    var $name = "John"; // instance variable
}

有了这个观点:

<p> <?=$name?> </p>

我的问题是:

  1. 如何创建一个Controller-&gt; render()函数或类似函数,允许视图从控制器访问实例变量?和,
  2. 如果不执行像$data['view']['name'] = "John";这样的klutzy事情,或者默认情况下我必须为我创建的任何新控制器编写十行代码,我该如何做到这一点。我想这样做,所以它尽可能干。
  3. 感谢。

    编辑:FabioCosta的解决方案

    我不确定我理解,到目前为止,我有这样的基本控制器:

    <?php
        class Controller{
            public function __get($key){
                if(isset($this->$$key)) return $this->$$key;
            }
        }
    ?>
    

    我的基本视图类如下所示:

    <?php
        class View{
             public $controller;
             public function render(){
             $this->controller = $this;
        }
    ?>
    

    我从路由器初始化如下:

    <?php
        $controller = new IndexController();
        $view = new IndexView();
        $view->render();
    ?>
    

    然而,这不起作用,我知道我做错了。

2 个答案:

答案 0 :(得分:3)

为什么不通过实例化视图的控制器并使用__get魔术方法?

像这样:

  public function __get($key){

      if(isset($this->$key)) return $this->$key;
  }

这是一个工作示例View.php:

class View{
   protected $_controller;
   public function __construct(Controller $controller){
        $this->_controller=$controller;
   }
   public function render(){
        echo '<h1>Hello '.$this->_controller->name.'</h1>';
   }
}

Controller.php这样

class Controller{
    protected $name='fabio';
    protected $_myView;

    public function __get($key){

        if(isset($this->$key)) return $this->$key;
   }
    public function __construct(){
        $this->_myView=new View($this);
    }

    public function indexAction(){
        $this->_myView->render();
    }
}

路由器:

$c=new Controller();
$c->indexAction();

答案 1 :(得分:2)

  1. 控制器不应负责渲染输出。这是view实例应该做的事情。渲染应该在控制器外部进行。

  2. 视图应从model layer请求数据。然后,根据收到的信息,选择正确的template,分配数据并渲染此模板(或在某些情况下 - 模板组)。

  3. 此外,路由器不应初始化控制器和视图。控制器应仅负责处理请求。