当前位置: 首页 > 后端技术 > PHP

【翻译】PHP-DIandDependencyInjectionBestPractices

时间:2023-03-30 00:11:26 PHP

PHP-DI是一个用PHP编写的强大实用的框架无关依赖注入容器。这是关于如何使用PHP-DI和依赖注入的最佳实践指南。文章来自PHP-DI,由MatthieuNapoli和贡献者撰写。PHP-DI是一个功能强大、功能强大、与框架无关的依赖注入容器,用PHP编写。原文地址(英文):http://php-di.org/doc/best-pr...PHP-DI在【本站实用开源目录】链接:http://www.worldlink.com.cn/o...这是关于如何使用依赖注入的PHP-DI的最佳实践指南。虽然它可能无法涵盖所有??情况并满足每个人,但它可以作为帮助您开始依赖注入的起点。如果您不同意本指南中解释的任何内容,也没关系。您应该就这些问题发表自己的意见:)。它不会阻止您按照自己的方式使用PHP-DI。使用容器和依赖注入的规则以下是一些基本规则:不要直接从容器获取条目(始终使用依赖注入),更一般地说,在容器的配置配置中编写与容器针对接口的类型约束分离的代码在#Writing控制器中使用哪个实现在控制器中使用依赖注入通常是最痛苦的。如果我们以Symfony2为例(但这通常适用于每个框架),您可以选择以下选项:将控制器注入容器中,然后调用$container->get(...)这是不好的,请参阅规则n°1。在构造函数中注入依赖项(在Symfony中作为服务的控制器)当你有超过5个依赖项并且你的构造函数是15行样板代码时会很痛苦在属性中注入依赖项这是我们建议的解决方案。例如:classUserController{/***@Inject*@varFormFactoryInterface*/private$formFactory;publicfunctioncreateForm($type,$data,$options){//$this->formFactory->...}}如你所见,这个解决方案只需要很少的代码,很容易理解并且有利于IDE支持(自动完成,重构,...)。属性注入通常是不受欢迎的,并且有充分的理由:注入私有属性会破坏封装它不是显式依赖:如果您使用PHP-DI的注释来标记要注入的依赖项,则没有合同说您的类需要设置属性才能工作,然后你的类依赖于容器(见上面的规则2)但是如果你遵循关于如何编写你的应用程序的一般最佳实践,你的控制器将不包含任何业务逻辑(只对模型进行路由调用并将返回值绑定到视图).所以:你不会对它进行单元测试(这并不意味着你不会在界面上编写功能测试)你不需要在其他地方重用它如果你改变框架你可能不得不重写它(或部分它)(因为大多数依赖项,如请求、响应、模板系统等都会发生变化)此解决方案提供了许多优点而没有主要缺点,因此我们建议在控制器中使用注释。编写服务鉴于服务旨在可重用、可测试且独立于您的框架,我们不建议使用注解来注入依赖项。相反,我们建议使用构造函数注入和自动装配:classOrderServiceimplementsOrderServiceInterface{private$paymentService;公共函数__construct(PaymentServiceInterface$paymentService){$this->paymentService=$paymentService;}publicfunctionprocessOrder($order){$this->paymentService->...}}通过使用自动装配(默认启用),您可以自己将构造函数的每个参数保存在绑定配置中。PHP-DI将通过检查您的参数类型来猜测它需要注入哪个对象。在某些情况下,使用自动装配是不够的,因为某些参数将是标量(字符串、整数、...)。此时您需要明确定义要在该标量参数中注入的内容,为此您可以:定义方法/类的整个注入(即每个参数)。例如:DI\object()->constructor(DI\get(SomeOtherService::class),'avalue'),];或者只定义标量参数并让PHP-DI使用自动装配。示例:DI\object()->constructorParameter('paramName','avalue'),];通常首选此解决方案,避免重新定义所有内容。旁注:如第3条规则所述,我们建议使用类型约束接口。在这种情况下,您需要将接口映射到容器应在配置中使用的实现:使用库当使用记录器、ORM等库时,...有时需要配置它们。在这种情况下,我们建议您在配置文件中定义这些依赖项。当配置有点复杂时,我们还建议使用匿名函数。匿名函数允许您编写真正的PHP代码,这很棒,因为您可以使用库的文档,获得IDE支持,并且作为PHP开发人员,您明白:)。这是一个例子,Monolog,一个PHP记录器:DI\factory(function(){$logger=newLogger('mylog');$fileHandler=newStreamHandler('path/to/your.log',Logger::DEBUG);$fileHandler->setFormatter(newLineFormatter());$logger->pushHandler($fileHandler);return$logger;}),];当然,如你所见,我们使用PSR-3接口进行注入。这样,我们可以随时用任何PSR-3记录器替换Monolog,只需更改此配置即可。