【发布时间】:2014-07-16 11:52:43
【问题描述】:
我通过将 NavHelper 类注入到我的抽象控制器中,将其加载到我的 imcro MVC 框架的每个控制器中。但我真的应该把它注入那里吗?
NavHelper 类实际上是为视图设计的。它有一个静态函数,可以根据当前请求 URI 返回一个动态构建的导航项数组。但是,既然视图不应该担心对象的创建,我将如何直接在视图中使用它呢?
否则我必须像现在一样将它加载到控制器中,然后在 每个 控制器中重复以下操作,这不是 DRY,然后将其发送到视图。
View::render('nav', $nav->get());
Controller.php
abstract class Controller
{
protected $req;
protected $nav;
public function __construct(Req $req, NavHelper $nav)
{
$this->req = $req;
$this->nav = $nav;
}
}
【问题讨论】:
-
不知道你的助手是如何工作的——它返回了什么。如果它是 html,那么您应该将其注入 HtmlView 对象并将从模型层获取的数据传递给它。如果这个助手更像是一个服务,那么它属于模型层,它正在为视图(或实际上所有类型的视图)准备输出数据(来自控制器)。这个帮助器不知道很多事情(比如:URI 有效吗?Doe 的用户可以访问它吗?...)并且不应该在模型外部操作,除非它是 html 的唯一显示帮助器,但它甚至更不知道。
-
它实际上检查用户是否登录,并基于此在包含键值对的数组中返回相应的菜单项,例如
'Name' => '/page'。 -
@KidDiamond 你知道Law of Demeter 是什么吗?因为你的代码会违反它。将某些东西传递给您的视图需要的控制器有什么意义?为什么不首先将其传递给视图?当然,这会假设您实际上有一个完全实现的视图实例,而不是一些您喜欢假装是“视图”的伪造模板。
标签: php model-view-controller dependency-injection