Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP反射API编写和使用PHP依赖项注入控制器_Php_Dependency Injection_Php 7 - Fatal编程技术网

如何使用PHP反射API编写和使用PHP依赖项注入控制器

如何使用PHP反射API编写和使用PHP依赖项注入控制器,php,dependency-injection,php-7,Php,Dependency Injection,Php 7,我试图在纯OOP应用程序中实现一个简单的DI。我想使用依赖注入来管理许多服务(数据库、RequestValidator、缓存等)。我读过很多博客,也很喜欢,但我真的不明白应该把它们放在哪里。有人能告诉我怎么做吗 我希望它干净,因此希望使用基于构造函数的注入。因此,如果我有一个类,比如说AbstractBaseController,它将注入一个名为Request的依赖项,那么我将写: php: 您应该在应用程序的最底层实例化您的容器(考虑到一个非常简单的应用程序,想想引导类,甚至是index.ph

我试图在纯OOP应用程序中实现一个简单的DI。我想使用依赖注入来管理许多服务(数据库、RequestValidator、缓存等)。我读过很多博客,也很喜欢,但我真的不明白应该把它们放在哪里。有人能告诉我怎么做吗

我希望它干净,因此希望使用基于构造函数的注入。因此,如果我有一个类,比如说
AbstractBaseController
,它将注入一个名为
Request
的依赖项,那么我将写:

php:


您应该在应用程序的最底层实例化您的容器(考虑到一个非常简单的应用程序,想想引导类,甚至是index.php本身的顶部),因为您需要在所有后续服务实例化之前准备好容器

在容器实例化之前,唯一可能执行的其他事情是与配置相关的,因为这些通常是容器正常工作所需的(配置参数、PSR-4自动加载配置等)

例如,假设您有一个名为
MyController
的类,它扩展了抽象类
AbstractBaseController

然后,例如,在index.php上,您可以实例化您的容器和控制器:

//index.php
$container = new Container();
$controller = $container->get('namespace\of\MyController');
$controller->render();
当您这样做时,来自构造函数的所有依赖项都将由容器库的自动布线模块处理

在实际应用程序中,控制器的实例化通常在路由器内处理,路由器将URL地址、方法和参数映射到容器要加载的不同类


自动关联的一条经验法则是,您永远不能再直接调用\MyController()的
new namespace\of
,因为手动实例化它需要传递每个构造函数依赖项(因此您不是真正使用自动关联功能)。实例化它的正确方法总是使用
$container->get('namespace\of\MyController')

在这种情况下,构造函数注入是如何工作的?这就像在需要时使用setter设置依赖项(当然,它会向下挖掘依赖项树并解析其他依赖项)。我只是想让它如何工作,容器是负责构造函数注入的容器。当您调用
$container->get()
时,它将为您执行此操作。Laravel也做了同样的事情,它的路由器被配置为在传递控制器类的容器上调用
->get()
,因此它可以解析完整的依赖树。我的答案中是否遗漏了什么?我以前已经完成了,你正在尝试做的,所以我知道它是有效的。如果我的答案中有任何一步不清楚,请在这里发表评论,我会尽力帮助你。嘿,谢谢,我会尝试一下,让你知道:)谢谢。这完全奏效了。但我想用你的评论编辑你的答案会给人们提供这个问题的具体答案。对我来说,用拉雷维尔的路线来类比是有道理的。