【问题标题】:Load NavHelper class in every controller for the View在视图的每个控制器中加载 NavHelper 类
【发布时间】: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


【解决方案1】:

这是模型的工作,所以将它注入那里(或者可能将它的方法包含到一些更大的类中?)。此外,它取决于另一个模型的具有登录信息的对象(通常是用户),因此在构建导航/推送登录数据/注入用户指针之前考虑检查(取决于行为和所需的信息量)。示例:

型号

//... has User and NavHelper injected
public function getNav() {
    return $this->navHelper->get($url_string, $this->user->loggedIn);
}

导航助手

//...
public function get($url_string, $user_logged_in) {
    ...
    return $this->navArray;
}

查看

//... has model pointer injected
private function renderNav() {
    foreach ($this->model->getNav() as $item => $url) { ... }
}

附言。尽量避免使用静态方法——它与使用全局变量有相同的缺陷(你无法判断它在哪里使用,即什么取决于它以及它的状态可能在哪里改变)。

【讨论】:

  • 与导航可视化相关的任务将成为 UI 逻辑的一部分。你同意吗?所以.. emm ... 为什么要将 UI 逻辑放在模型层的代码中?哦,顺便说一句,模型不是类或对象
  • @tereško - 我认为 View 不关心什么(数据)将如何显示。如果 UI 逻辑决定它应该得到什么,我将不得不为每个视图重写它,并且在某些时候仍然必须处理相同的数据块。也许我在这里没有得到任何东西 - 你能写下你的答案来澄清吗?
  • 请不要将templates 与视图混淆。或许this 能帮到你一点。
  • @tereško “创建此响应视图从模型层获取信息” - 仍然没有。这正是我写的。
  • 导航是UI的概念,它与模型层无关
猜你喜欢
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多