Php 我的服务经理/定位器。我可以注入它吗?或者它只应该创建服务吗?

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(

好的,我有一个服务管理器/定位器/工厂对象,它创建和管理我的单个实例对象,比如我的记录器、http请求、http响应、路由器等

在我的启动/引导文件中,我只是实例化它并启动我的服务:

$services = new Services();

$logger = $services->getService('logger');
$security = $services->getService('security');
$auth = $services->getService('auth');
$router = $services->getService('router');
etc...
它知道每个服务的依赖关系,并像工厂一样轻松创建对象

问题是我的
Auth
类,例如,如果它在几个月内还需要两个依赖项,我只需要:

  • 修改my
    Services
    类中实例化
    Auth
    类的方法
  • 在my
    Auth
    类中修改构造函数,并添加两个新的依赖项
  • 不到五分钟

    $services
    对象还实例化了我的控制器。每个控制器都有一个依赖项(此时),即
    视图

    这方面的问题是,当我再创建20个控制器时,显然所有控制器都具有相同的依赖项,然后在几个月后,我需要向控制器添加两个依赖项,我必须:

  • 修改my
    Services
    类中实例化
    控制器的方法
  • 修改每个控制器类的构造函数,并添加两个新的依赖项
  • 我知道,如果我在services manager/locator/factory对象之外独立创建控制器,并将
    $services
    对象注入控制器,那么我创建的每个控制器都只有一个依赖项,这将是可行的。我可以制作一百万个,如果出现另一个依赖项,我就不必去更改所有的控制器文件,但这样可以吗

    我觉得当它只需要来自服务管理器的一个或两个服务时,它会向控制器注入很多,而且它会对您隐藏控制器依赖项,它们不像您将它们注入构造函数那样可见

    你对此有何看法?你觉得我该怎么办


    谢谢。

    听起来您需要一个控制器工厂(或方法),您可以在服务类中使用它。
    作为参数,您可以传入类名,例如:

    $controller = $this->controllerFactory->create('Foo\BarController');
    $controller->setAnotherDependency($baz);
    
    并非所有控制器都共享的其他依赖项可以通过setter添加


    顺便说一句:为什么不使用像或这样的依赖容器?

    我不确定我是否理解你的问题。。。但是,如果您需要在每个控制器中实现一个新的依赖项,为什么不将其添加到父控制器类中呢?。。。我认为一个好的类层次结构应该可以避免在所有控制器上重复代码。也许如果你发布了一些关于你如何处理
    服务
    和控制器类中的依赖关系的示例代码,它可以帮助我们了解你需要什么。@tereško Haha我大概看了15分钟的视频。从你的“如何在MVC中构建一个模型”的帖子中找到了它,这是非常好的@巴托,我明白你的意思了。我在每个控制器中都有一个构造函数,它有
    parent::u构造(Dependency1,2但是现在我要去掉这些,只使用基本控制器构造函数来设置任何依赖项,这样将来添加任何新的依赖项都很简单。谢谢,谢谢你的回复。是的,我用的是Symfony2 DIC。我想我现在已经弄明白了。