在我的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);
答案 0 :(得分:0)
但这是一个好方法吗?我知道这是依赖注入,但是 如果我的班级需要任何额外的课程怎么办?我必须这样做吗? 通过依赖项在子控制器构造函数中设置它们 注射?
如果您需要与依赖注入相关的好处,这是一个很好的方法,因为您显然会以这种方式承担一些开销。
如果您稍后获得其他依赖项,则是,您必须适当地更改基础和/或派生构造函数。
如果是这样,那意味着我的路由器必须保存每个列表 控制器和依赖对象知道适当的数量和 每个特定控制器中要注入的对象的顺序。
这是直截了当的结论,但它会违反DRY,显然是你设计中的一个痛点。这就是为什么当你走这条路时,你几乎可以利用一个DI容器(例如illuminate/container)来自动解析依赖关系并像这样实例化你的类:
$controller = $container->make($controller);
容器将查找类,确定其依赖关系,递归解析它们,并实例化所需的对象。