并且$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'));
//...
}
}
看法
视图可以直接访问模型。为了使视图更具可重用性和可维护性,您最好将所需的东西作为函数参数(或通过设置器)传递
class View
{
public function render($templateFile, array $vars = array())
{
ob_start();
extract($vars);
require($templateFile);
return ob_get_clean();
}
}
应该如何初始化视图以及如何将变量传递给它?
首先 - 一个视图应该在 MVC-triad 之外实例化。由于控制器写入视图或模型 - 您可以通过控制器将变量传递给视图。
$model = new Model();
$view = new View($model);
$controller = new Controller($view);
// This will assign variables to view
$controller->indexAction();
echo $view->render();
注意:在现实世界的场景中,模型不是一个类,而是抽象层。我称之为Model
演示目的。