在每个控制器上自动加载某些类的好方法是什么?

时间:2014-05-21 10:59:12

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

在我的MVC框架中的所有控制器上自动加载某些类会有什么好方法?

如果用户已登录,我需要检查每个页面,以便我可以相应地执行代码,以及返回该控制器动态构建的导航(数组)的菜单助手。

我只是在父控制器构造函数中执行它,因此扩展它的每个类都将自动继承它们。

abstract class Controller
{
    protected $request;
    protected $user;
    protected $menu;

    public function __construct(Request $request, User $user, MenuHelper $menu)
    {
        $this->request = $request;
        $this->user    = $user;
        $this->menu    = $menu;
    }

    protected abstract function index();
}

但这是一个好方法吗?我知道这是依赖注入,但是如果我的类需要任何额外的类呢?我是否必须通过依赖注入在子控制器构造函数中设置它们?

如果是这样,这意味着我的路由器必须保存每个控制器和依赖项对象的列表,以了解要在每个特定控制器中注入的对象的适当数量和顺序。

现在我只是在路由器中调用每个控制器,如下所示:

$controller = new $controller();

$controller->$action($params);

1 个答案:

答案 0 :(得分:0)

  

但这是一个好方法吗?我知道这是依赖注入,但是   如果我的班级需要任何额外的课程怎么办?我必须这样做吗?   通过依赖项在子控制器构造函数中设置它们   注射?

如果您需要与依赖注入相关的好处,这是一个很好的方法,因为您显然会以这种方式承担一些开销。

如果您稍后获得其他依赖项,则是,您必须适当地更改基础和/或派生构造函数。

  

如果是这样,那意味着我的路由器必须保存每个列表   控制器和依赖对象知道适当的数量和   每个特定控制器中要注入的对象的顺序。

这是直截了当的结论,但它会违反DRY,显然是你设计中的一个痛点。这就是为什么当你走这条路时,你几乎可以利用一个DI容器(例如illuminate/container)来自动解析依赖关系并像这样实例化你的类:

$controller = $container->make($controller);

容器将查找类,确定其依赖关系,递归解析它们,并实例化所需的对象。