0

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

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

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

看看这个:

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

我的问题是这样的:

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

谢谢。

编辑: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();
?>

但是,这不起作用,我知道我做错了什么。

4

2 回答 2

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

控制器.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();
于 2012-06-14T12:10:29.383 回答
2
  1. 控制器不应该负责渲染输出。这是view实例应该做的事情。渲染应该发生在控制器之外。

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

此外,路由器不应初始化控制器或视图。控制器应该只负责处理请求。

于 2012-06-14T12:33:32.960 回答