依赖注入组件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

依赖注入组件

DependencyInjection组件实现了一个PSR-11兼容的服务容器,允许您在应用程序中标准化和集中构造对象的方式。

有关依赖注入和服务容器的介绍,请参见服务容器

安装

1
Composer需要symfonyob娱乐下载/依赖注入

请注意

如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

基本用法

另请参阅

本文解释了如何在任何PHP应用程序中使用DependencyInjection特性作为独立组件。读了服务容器文章,以了解如何在Symfony应用程序中使用它。ob娱乐下载

你可能有这样一个类梅勒您希望作为服务提供的:

1 2 3 4 5 6 7 8 9 10 11
梅勒私人运输公共函数__construct()->运输=“发送邮件”;}/ /……

你可以在容器中注册一个服务:

1 2 3 4
使用ob娱乐下载组件DependencyInjectionContainerBuildercontainerBuilderContainerBuilder ();containerBuilder->注册(“梅勒”“梅勒”);

类的一个改进是允许容器设置运输使用。如果你改变类,这样就会传递给构造函数:

1 2 3 4 5 6 7 8 9 10 11
梅勒私人运输公共函数__construct运输->运输=运输;}/ /……

然后可以在集装箱中设置运输方式的选择:

1 2 3 4 5 6
使用ob娱乐下载组件DependencyInjectionContainerBuildercontainerBuilderContainerBuilder ();containerBuilder->注册(“梅勒”“梅勒”->addArgument (“发送邮件”);

这个类现在灵活得多,因为您已经将传输的选择从实现中分离出来,并将其放入容器中。

您所选择的邮件传输方式可能是其他服务需要了解的。方法将其设置为容器中的参数,然后将此参数用于梅勒服务的构造函数参数:

1 2 3 4 5 6 7
使用ob娱乐下载组件DependencyInjectionContainerBuildercontainerBuilderContainerBuilder ();containerBuilder->setParameter (“mailer.transport”“发送邮件”);containerBuilder->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);

既然梅勒服务在容器中,您可以将其作为其他类的依赖项注入。如果你有欧宝平台是合法的吗NewsletterManager类是这样的:

1 2 3 4 5 6 7 8 9 10 11
欧宝平台是合法的吗NewsletterManager私人梅勒公共函数__construct(\梅勒梅勒->梅勒=梅勒;}/ /……

当定义欧宝平台是合法的吗newsletter_manager服务,梅勒服务还不存在。使用参考类来通知容器注入梅勒服务初始化通讯管理器时:欧宝平台是合法的吗

12 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件DependencyInjection参考containerBuilderContainerBuilder ();containerBuilder->setParameter (“mailer.transport”“发送邮件”);containerBuilder->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);containerBuilder->注册(“欧宝平台是合法的吗newsletter_manager”“欧宝平台是合法的吗NewsletterManager”->addArgument (引用(“梅勒”));

如果欧宝平台是合法的吗NewsletterManager不需要梅勒注入它是可选的,然后你可以使用setter注入:

1 2 3 4 5 6 7 8 9 10 11
欧宝平台是合法的吗NewsletterManager私人梅勒公共函数setMailer(\梅勒梅勒->梅勒=梅勒;}/ /……

您现在可以选择不注入梅勒欧宝平台是合法的吗NewsletterManager.如果你想这样做,容器可以调用setter方法:

12 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件DependencyInjection参考containerBuilderContainerBuilder ();containerBuilder->setParameter (“mailer.transport”“发送邮件”);containerBuilder->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);containerBuilder->注册(“欧宝平台是合法的吗newsletter_manager”“欧宝平台是合法的吗NewsletterManager”->addMethodCall (“setMailer”, (引用(“梅勒”)));

然后你可以得到你的欧宝平台是合法的吗newsletter_manager来自容器的服务如下所示:

1 2 3 4 5 6 7
使用ob娱乐下载组件DependencyInjectionContainerBuildercontainerBuilderContainerBuilder ();/ /……欧宝平台是合法的吗newsletterManagercontainerBuilder->get (“欧宝平台是合法的吗newsletter_manager”);

避免你的代码依赖于容器

虽然您可以直接从容器中检索服务,但最好将此最小化。例如,在欧宝平台是合法的吗NewsletterManager你注射了梅勒服务,而不是从容器中请求。你可以把容器注入,然后取回梅勒服务,但它将被绑定到这个特定的容器,从而很难在其他地方重用该类。

在某些时候,您将需要从容器中获取服务,但在应用程序的入口点,这应该尽可能少。

使用配置文件设置容器

除了如上所述使用PHP设置服务之外,您还可以使用配置文件。这允许您使用XML或YAML来编写服务的定义,而不是像上面的例子中那样使用PHP来定义服务。在除了最小的应用程序之外的任何应用程序中,通过将服务定义移动到一个或多个配置文件中来组织它们是有意义的。要做到这一点,还需要安装Config组件

加载XML配置文件:

1 2 3 4 5 6 7
使用ob娱乐下载组件配置FileLocator使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件DependencyInjection加载程序XmlFileLoadercontainerBuilderContainerBuilder ();加载程序XmlFileLoader (containerBuilderFileLocator (__DIR__));加载程序->负载(“xml”);

加载YAML配置文件:

1 2 3 4 5 6 7
使用ob娱乐下载组件配置FileLocator使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件DependencyInjection加载程序YamlFileLoadercontainerBuilderContainerBuilder ();加载程序YamlFileLoader (containerBuilderFileLocator (__DIR__));加载程序->负载(“services.yaml”);

请注意

如果你想加载YAML配置文件,那么你也需要安装Yaml组件

提示

如果您的应用程序使用非常规的文件扩展名(例如,您的XML文件有一个config扩展名),可以将文件类型作为参数的第二个可选参数load ()方法:

1 2
/ /……加载程序->负载(“services.config”“xml”);

如果你如果你想使用PHP来创建服务,那么你可以把它移动到一个单独的配置文件中,并以类似的方式加载它:

1 2 3 4 5 6 7
使用ob娱乐下载组件配置FileLocator使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件DependencyInjection加载程序PhpFileLoadercontainerBuilderContainerBuilder ();加载程序PhpFileLoader (containerBuilderFileLocator (__DIR__));加载程序->负载(“services.php”);

您现在可以设置欧宝平台是合法的吗newsletter_manager而且梅勒使用配置文件的服务:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12
参数:#……mailer.transport:sendmail服务:梅勒:类:梅勒参数:[' % mailer.transport % ')欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManager电话:-[setMailer,(' @mailer '])
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。