【发布时间】:2017-03-03 17:31:49
【问题描述】:
我已经评论了这个帖子,但它似乎已经死了,所以我要开一个新帖子:Dependency Injection Slim Framework 3
上面的帖子解释了如何将 Slims Container 传递给您自己编写的类。
然而,OP 已经询问是否有可能让 Slim 依赖注入 ALL 他们的类。
我也很想知道是否有办法做到这一点,因为如果你必须将容器传递给你想使用它的 每个 类,它似乎不是 DRY。
例如,如果我想使用 Slim 的功能之一(例如进行重定向,在我自己的一个类中)我不能按照文档使用它:
$res->withStatus(302)->withHeader('Location', 'your-new-uri');
因为$res(响应对象)不在我的班级范围内,除非我注入/传递它。
问题是,如果我有 100 个类,我是否必须通过(或注入)容器 100 次?这看起来真的,真的很乏味。
在像 CakePHP 这样的框架中,您可以使用“AppController”来全局执行此类操作,即定义一次,并使其在您的所有类中可用。 Slim 不提供这个功能吗?如果不是,那将是一个严重的缺陷,IMO。
编辑 - 我从我制作的其中一个 cmets 中添加此内容,以尝试进一步解释该问题:
如果您查看第一个应用程序教程 - http://slimframework.com/docs/tutorial/first-app.html - 他们正在向容器添加 PDO 数据库连接。
假设我在一个子目录中有 100 个单独的类(该示例有一个 ../classes/ 目录)并使用 spl_autoload_register() 在 index.php 中自动加载它们。该容器在任何这些类中都不可用。
如果我必须通过 100 次不同的时间,每次我使用我的一个类时,只是为了获得一个 PDO 连接(这只是一个示例),那么这会使代码非常重复,即不是 DRY。
【问题讨论】:
-
由于 Slim 默认使用 Pimple 作为 DIC,也许您应该研究一下? pimple.sensiolabs.org
-
AFAIK,Pimple 没有任何方法可以自动解决构造函数依赖项。因此,您需要将所有类注册到容器中。但是,我不明白为什么这会违背 DRY?当您将类注册到容器时,您仍然会从容器中注入依赖项,因此所有类只注册和解析一次...查看 Pimples 站点以获取示例。
-
@MagnusEriksson 举个例子-如果您查看第一个应用程序教程-slimframework.com/docs/tutorial/first-app.html-他们正在向容器添加 PDO 数据库连接。现在..假设我在一个子目录中有 100 个单独的类(该示例有一个 ../classes/ 目录)并使用 spl_autoload_register() 在 index.php 中自动加载它们。该容器在任何这些类中都不可用。如果我必须写 100 次东西才能在每个类中获得我的 PDO 连接,那并不是 DRY,因为我将本质上相同的代码重复 100 次。
-
您仍将只创建一个 PDO 连接并将该连接传递给所有类。当然,您需要将相同的实例注入所有类,但这并不反对 DRY(您不是在重复相同的代码,您只是在重用相同的类实例)。您仍然只创建每个类一次(包括 PDO),并注入它们的依赖项。然而,这就是我不喜欢 Pimple 和类似容器的原因。我更喜欢像 Illuminate\Container 这样的容器,它使用反射来自动解决依赖注入。
-
您查看我发布的第一个链接了吗? Slims 容器基于 Pimple,因此您可以查看该页面以更详细地了解如何使用该容器。例如,查看关于定义服务的部分。为容器定义服务和自动加载类是两件不同的事情......