在View的每个控制器中加载NavHelper类

时间:2014-05-27 14:02:38

标签: php model-view-controller dependency-injection

我将我的NavHelper类加载到我的imcro MVC框架的每个控制器中,方法是将它注入我的抽象控制器中。但我真的应该把它注入吗?

NavHelper类实际上适用于View。它有一个静态函数,它根据当前请求URI返回动态构建的导航项数组。但是我如何直接在视图中使用它,因为视图并不是要担心对象创建?

否则,我必须像我现在一样在控制器中加载它,并在每个控制器中重复以下操作,这不是干,然后将其发送到视图。

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

1 个答案:

答案 0 :(得分:1)

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

模型

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

NavHelper

//...
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) { ... }
}

聚苯乙烯。尽量避免使用静态方法 - 它与使用全局变量具有相同的缺陷(你无法分辨它的使用位置,即取决于它的位置以及它的状态可能会发生变化)。