如何正确地将数据从控制器传递到视图?

goo*_*ing 11 php model-view-controller

我目前的实施:

class SomeController extends AppController
{
    function someaction()
    {   
        $d['text'] = "ahoy!";
        $this->render("someactionView", $d);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在AppController:

function render($file, $data = "")
{
    require "views/" . $file . ".php";
}
Run Code Online (Sandbox Code Playgroud)

并且$data将在视图文件中提供.这是正确的实施吗?这种实现有什么谬误吗?

Yan*_*ang 11

并且$data将在视图文件中提供.这是正确的实施吗?这种实现有什么谬误吗?

基本上你像大多数框架一样实现它.这有几个问题:

  • 控制器接受输入并发送输出(打破单一责任原则)
  • 视图与HTML紧密耦合.因此,您不能将相同的视图重用于其他内容,例如XML,JSON.
  • 如果你require "views/" . $file . ".php";render()方法中做- 你再次紧紧地结合它.如果您更改视图的位置怎么办?然后你必须稍微重写你的方法.这种方法仅仅会杀死重用能力.

刷新您的基本知识:

控制器(也称为编辑器)

仅用于单一目的.它改变模型状态-也就是说,它应该采取的是来自一个输入$_POST,$_GET,$_FILES,$_COOKIE.在控制器中,只应进行变量赋值,仅此而已.

class Controller
{
   public function indexAction()
   {
        $this->view->setVar('age', $this->request->getPostParam('age'));
        $this->view->setVar('user', $this->request->getPostParam('user'));
        //...
   }
}
Run Code Online (Sandbox Code Playgroud)

视图

视图可以直接访问模型.为了使make视图更易于重用和维护,你最好将所需的东西作为函数参数传递(或通过setter)

class View
{
   public function render($templateFile, array $vars = array())
   {
      ob_start();
      extract($vars);
      require($templateFile);

      return ob_get_clean();
   }
}
Run Code Online (Sandbox Code Playgroud)

应该如何初始化视图以及如何将变量传递给它?

首先 - 视图应该在MVC-triad之外实例化.由于控制器写入视图或模型 - 您将通过控制器传递变量.

$model = new Model();
$view = new View($model);

$controller = new Controller($view);

// This will assign variables to view
$controller->indexAction();

echo $view->render();
Run Code Online (Sandbox Code Playgroud)

注意:在现实世界中,模型不是类,而是抽象层.我称它为Model演示目的.

  • 很高兴在这里看到一些更新.你能解释一下视图如何与你的例子中的模型进行通信吗?如何调用组件来初始化视图,模型和控制器? (2认同)

hek*_*mgl 3

IMO 该render()方法属于视图而不属于控制器。代码应该如下所示:

控制器:

class SomeController extends AppController
{
    function someaction()
    {   
        $d['text'] = "ahoy!";
        $view = new SomeActionView();
        $view->assign('data', $d);
        echo $view->render();
    }
}
Run Code Online (Sandbox Code Playgroud)

查看基类:

class View
{

    protected $data;

    function render($template) {
        ob_start();
        // you can access $this->data in template
        require "views/" . $template . ".php";
        $str = ob_get_contents();
        ob_end_clean();
        return $str;
    }


    function assign($key, $val) {
        $this->data[$key] = $val;
    }
}
Run Code Online (Sandbox Code Playgroud)

扩展View类

class SomeActionView extends View
{

    public function render($template = 'someActionTemplate') {
        return parent::render($template);
    }

}
Run Code Online (Sandbox Code Playgroud)