依赖注入组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

依赖注入组件

DependencyInjection组件允许您标准化和集中应用程序中构造对象的方式。

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

安装

你可以用两种不同的方式安装组件:

然后,要求供应商/ autoload.php文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。欧宝娱乐app下载地址

基本用法

您可能有一个简单的类,如下所示梅勒您希望作为服务提供的:

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

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

1 2 3 4
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder容器ContainerBuilder ();容器->注册(“梅勒”“梅勒”);

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

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

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

1 2 3 4 5 6
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder容器ContainerBuilder ();容器->注册(“梅勒”“梅勒”->addArgument (“发送邮件”);

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

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

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder容器ContainerBuilder ();容器->setParameter (“mailer.transport”“发送邮件”);容器->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);

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

1 2 3 4 5 6 7 8 9 10 11
欧宝app在哪里找NewsletterManager私人梅勒公共函数__construct(\梅勒梅勒->梅勒=梅勒;}/ /……

当定义欧宝app在哪里找newsletter_manager服务,梅勒服务还不存在。使用参考类来通知容器注入梅勒服务初始化通讯管理器时:欧宝app在哪里找

12 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件DependencyInjection参考容器ContainerBuilder ();容器->setParameter (“mailer.transport”“发送邮件”);容器->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);容器->注册(“欧宝app在哪里找newsletter_manager”“欧宝app在哪里找NewsletterManager”->addArgument (引用(“梅勒”));

如果欧宝app在哪里找NewsletterManager不需要梅勒注入它是可选的,然后你可以使用setter注入:

1 2 3 4 5 6 7 8 9 10 11
欧宝app在哪里找NewsletterManager私人梅勒公共函数setMailer(\梅勒梅勒->梅勒=梅勒;}/ /……

您现在可以选择不注入梅勒欧宝app在哪里找NewsletterManager.如果你想这样做,容器可以调用setter方法:

12 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件DependencyInjection参考容器ContainerBuilder ();容器->setParameter (“mailer.transport”“发送邮件”);容器->注册(“梅勒”“梅勒”->addArgument (“% mailer.transport %”);容器->注册(“欧宝app在哪里找newsletter_manager”“欧宝app在哪里找NewsletterManager”->addMethodCall (“setMailer”数组引用(“梅勒”)));

然后你可以得到你的欧宝app在哪里找newsletter_manager来自容器的服务如下所示:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder容器ContainerBuilder ();/ /……欧宝app在哪里找newsletterManager容器->get (“欧宝app在哪里找newsletter_manager”);

避免你的代码依赖于容器

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

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

使用配置文件设置容器

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

加载XML配置文件:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件配置FileLocator使用欧宝娱乐app下载地址组件DependencyInjection加载程序XmlFileLoader容器ContainerBuilder ();加载程序XmlFileLoader (容器FileLocator (__DIR__));加载程序->负载(“xml”);

加载YAML配置文件:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件配置FileLocator使用欧宝娱乐app下载地址组件DependencyInjection加载程序YamlFileLoader容器ContainerBuilder ();加载程序YamlFileLoader (容器FileLocator (__DIR__));加载程序->负载(“services.yml”);

请注意

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

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

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件配置FileLocator使用欧宝娱乐app下载地址组件DependencyInjection加载程序PhpFileLoader容器ContainerBuilder ();加载程序PhpFileLoader (容器FileLocator (__DIR__));加载程序->负载(“services.php”);

您现在可以设置欧宝app在哪里找newsletter_manager而且梅勒使用配置文件的服务:

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