一个PHP网站中哪些部分由依赖注入容器处理?

4
在阅读了无数关于依赖注入容器的模糊教程之后,我感觉我还没有完全理解它的核心。
当涉及到应用程序特定的内容(如模型、控制器等)时,我该如何管理自动注入依赖项?
我恰好有一个庞大的网站,可能有30-40种不同类型的模型...我真的要创建一个单一的应用程序依赖管理器来处理这些不同类型的模型吗?
我曾经有人告诉我DIC不适用于域相关的东西,而更适用于框架相关的东西,但我也听到了相反的说法。
哪个是“正确”的?
奖励问题:
如果DIC不适用于域层对象(如模型),那么你如何向域层对象传递依赖项?

顺便说一下,我意识到在技术上并没有“正确”的答案......但是对于这些哲学之间的解释,我会非常感激。 - johnnietheblack
此外,我似乎看到的大多数教程示例都是针对商业模型的...比如“ShippingService”等等...这就让人感到困惑... - johnnietheblack
2个回答

1

这个问题不是很清楚,但我会尝试回答。

对于应用程序特定的事物(如模型、控制器等),我应该如何管理依赖项的自动注入?

您使用 DIC 吗?您是编写了一个还是使用了一个库?

也许一个库可以帮助,我是 PHP-DI 的作者,所以我有偏见,但是这个库可以帮助我自动注入依赖项。

例如,我可以编写:

class UserController
{
    private $formFactory;

    public function __construct(FormFactory $formFactory) {
        $this->formFactory = $formFactory;
    }

    public function createForm($type, $data, $options) {
        // $this->formFactory->...
    }
}

在这种情况下,DIC可以检测到你的控制器需要什么依赖项,并自动注入它们。这使得生活更加容易。
“我恰好有一个大型网站,可能有30-40种不同类型的模型...我真的需要创建一个单一的应用程序依赖管理器来处理这些不同类型吗?”
为什么你需要那个?我不明白需要什么,也许你需要解释一下问题是什么。
“有人告诉我DIC不适用于领域相关的东西,而更适用于框架相关的东西,我也听到了相反的说法。”
哪一个是“正确”的?
在我看来,“领域相关的东西”和“框架相关的东西”之间没有区别。唯一困难的是,DIC注入实体时,因为这不是一个“单例”(不是Singleton Pattern的方式):这些对象不受DIC“管理”,你可以在代码中的任何地方手动创建实例。例如:
$user = new User();

如果User类需要一个服务,在你的代码中每个地方都需要这样做:
$user = new User($service);

相反,您永远不需要手动创建服务(永远不需要调用“new”),因此您可以让容器创建实例并注入所有内容。
我对我的答案并不太满意,因为它有点含糊不清,但是我很难确定你的问题是什么。也许你应该给出代码示例,或者至少解释得更详细一些。
PS:我也曾经努力理解DI和DIC是什么,不要满足于“我想我现在有点明白了,虽然还不完全”,我也是这样做的,花了几个月的时间才最终理解。
如果有帮助的话,请阅读http://mnapoli.github.io/PHP-DI/的介绍文本,也许还可以阅读http://mnapoli.fr/controllers-as-services/(虽然不直接相关,但可能有所帮助)。

1

也许不完全符合您的要求,但这里有一个依赖注入容器(DIC)的使用示例

假设我有一个数据库类和一个缓存类。我需要能够在我的其他类(模型、控制器等)中访问我的数据库和缓存类。

这是一个DIC会派上用场的情况,我可以简单地将我的数据库和缓存类存储在DIC类中,并将该DIC类传递到需要访问它所持有的对象的任何其他类中。


好的,我已经开始看得更清楚了。但是以这种方式,您将DIC类描述为(不要杀了我)服务定位器,用于框架级别服务注入到域层对象中(而不是某个单例或全局变量)。 是这样吗? - johnnietheblack
顺便说一下,如果是这样的话,那我完全理解了。哈哈,我并不是在挑战答案。 - johnnietheblack
对我来说,DIC基本上只是一个容器,用于保存我需要经常传递和访问的任何对象,而不是传递/注入多个对象,我可以简单地传递/注入DIC对象,该对象可以保存需要在整个应用程序中使用的多个其他对象。 - JasonDavis
1
有趣。我也读到过将DIC传递给其他对象有点违背初衷,因为它会创建一个“拉”依赖项的选项,因此不再注入它们。在那种情况下,我们似乎失去了对对象的控制? - johnnietheblack
不,不,不,抱歉我不同意。你描述的是服务定位器而不是依赖注入容器。这两者不同,而且服务定位器有缺点。我会给这个问题添加一个替代答案。 - Matthieu Napoli
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接