Php 我的服务经理/定位器。我可以注入它吗?或者它只应该创建服务吗?
好的,我有一个服务管理器/定位器/工厂对象,它创建和管理我的单个实例对象,比如我的记录器、http请求、http响应、路由器等 在我的启动/引导文件中,我只是实例化它并启动我的服务:Php 我的服务经理/定位器。我可以注入它吗?或者它只应该创建服务吗?,php,oop,model-view-controller,dependency-injection,Php,Oop,Model View Controller,Dependency Injection,好的,我有一个服务管理器/定位器/工厂对象,它创建和管理我的单个实例对象,比如我的记录器、http请求、http响应、路由器等 在我的启动/引导文件中,我只是实例化它并启动我的服务: $services = new Services(); $logger = $services->getService('logger'); $security = $services->getService('security'); $auth = $services->getService(
$services = new Services();
$logger = $services->getService('logger');
$security = $services->getService('security');
$auth = $services->getService('auth');
$router = $services->getService('router');
etc...
它知道每个服务的依赖关系,并像工厂一样轻松创建对象
问题是我的Auth
类,例如,如果它在几个月内还需要两个依赖项,我只需要:
Services
类中实例化Auth
类的方法Auth
类中修改构造函数,并添加两个新的依赖项$services
对象还实例化了我的控制器。每个控制器都有一个依赖项(此时),即视图
这方面的问题是,当我再创建20个控制器时,显然所有控制器都具有相同的依赖项,然后在几个月后,我需要向控制器添加两个依赖项,我必须:
Services
类中实例化控制器的方法
$services
对象注入控制器,那么我创建的每个控制器都只有一个依赖项,这将是可行的。我可以制作一百万个,如果出现另一个依赖项,我就不必去更改所有的控制器文件,但这样可以吗
我觉得当它只需要来自服务管理器的一个或两个服务时,它会向控制器注入很多,而且它会对您隐藏控制器依赖项,它们不像您将它们注入构造函数那样可见
你对此有何看法?你觉得我该怎么办
谢谢。听起来您需要一个控制器工厂(或方法),您可以在服务类中使用它。
作为参数,您可以传入类名,例如:
$controller = $this->controllerFactory->create('Foo\BarController');
$controller->setAnotherDependency($baz);
并非所有控制器都共享的其他依赖项可以通过setter添加
顺便说一句:为什么不使用像或这样的依赖容器?我不确定我是否理解你的问题。。。但是,如果您需要在每个控制器中实现一个新的依赖项,为什么不将其添加到父控制器类中呢?。。。我认为一个好的类层次结构应该可以避免在所有控制器上重复代码。也许如果你发布了一些关于你如何处理
服务
和控制器类中的依赖关系的示例代码,它可以帮助我们了解你需要什么。@tereško Haha我大概看了15分钟的视频。从你的“如何在MVC中构建一个模型”的帖子中找到了它,这是非常好的@巴托,我明白你的意思了。我在每个控制器中都有一个构造函数,它有parent::u构造(Dependency1,2代码>但是现在我要去掉这些,只使用基本控制器构造函数来设置任何依赖项,这样将来添加任何新的依赖项都很简单。谢谢,谢谢你的回复。是的,我用的是Symfony2 DIC。我想我现在已经弄明白了。