0

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

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

$services = new Services();

$logger = $services->getService('logger');
$security = $services->getService('security');
$auth = $services->getService('auth');
$router = $services->getService('router');
etc...

它知道每个服务的依赖关系,并像工厂一样轻松创建对象。

事情是我的Auth课,例如,如果在几个月内不知何故需要另外两个依赖项,我只需要:

  1. 修改我的Services类中实例化Auth类的方法。
  2. 修改我的Auth类中的构造函数并添加两个新的依赖项。

不到五分钟。

这个$services对象也实例化了我的控制器。每个控制器都有 1 个依赖项(目前)View,.

这样做的问题是,当我创建 20 个以上的控制器时,显然都具有相同的依赖项,然后在几个月后我需要向控制器添加两个以上的依赖项,我将不得不:

  1. 修改我的Services类中实例化Controller类的方法。
  2. 修改每个Controller 类的构造函数并添加两个新的依赖项。

我知道如果我在服务管理器/定位器/工厂对象之外独立创建控制器并将$services对象注入控制器,那么我制作的每个控制器都只有一个依赖项。我可以制作一百万个,如果出现另一个依赖项,我不必去更改所有控制器文件,但这可以吗?

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

你对此有何看法?你认为我应该怎么做?

谢谢。

4

1 回答 1

0

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

$controller = $this->controllerFactory->create('Foo\BarController');
$controller->setAnotherDependency($baz);

其他依赖项,不是所有控制器共享的,您可以通过 setter 添加。

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

于 2013-01-01T23:02:37.743 回答