DependencyInjection组件

编辑该页面

DependencyInjection组件

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

介绍依赖注入和服务容器服务容器

安装

1
美元作曲家需要symfony /依赖项ob娱乐下载注入

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

基本用法

另请参阅

这篇文章解释了如何使用DependencyInjection功能作为一个独立的组件在任何PHP应用程序。读了服务容器文章在Symfony应用程序了解如何使用它。ob娱乐下载

你可能有一个如下的类梅勒您想要提供服务:

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

你可以注册这个容器的服务:

1 2 3 4
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;美元containerBuilder=ContainerBuilder ();美元containerBuilder- >注册(“梅勒”,“梅勒”);

类的改进,使其更加灵活是允许容器设置运输使用。如果你改变这是传递给构造函数的类:

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

然后你可以设置集装箱运输的选择:

1 2 3 4 5 6
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;美元containerBuilder=ContainerBuilder ();美元containerBuilder- >注册(“梅勒”,“梅勒”)- >addArgument (“发送邮件”);

这门课是现在更加灵活分隔的选择运输的实现和容器。

所选邮件传输可能是其他服务需要了解的东西。你可以不用改变它在多个地方,使容器中的一个参数,然后指这个参数梅勒服务的构造函数参数:

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

现在梅勒服务容器中可以注入的依赖其他的类。如果你有一个欧宝平台是合法的吗NewsletterManager类是这样的:

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\参考;美元containerBuilder=ContainerBuilder ();美元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方法:

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

你可以得到你欧宝平台是合法的吗newsletter_manager服务从容器中是这样的:

1 2 3 4 5 6 7
使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;美元containerBuilder=ContainerBuilder ();/ /……美元欧宝平台是合法的吗newsletterManager=美元containerBuilder- >get (“欧宝平台是合法的吗newsletter_manager”);

避免您的代码变得依赖于容器

当你可以直接从容器中检索服务最好最小化。例如,在欧宝平台是合法的吗NewsletterManager你注射梅勒服务,而不是要求的容器。你可以注射和检索的容器梅勒服务,但是它将被绑定到这个容器很难重用类。

你需要得到容器的服务在某种程度上,但这应该是尽可能少的时间在您的应用程序的入口点。

设置容器的配置文件

以及设置上面的服务使用PHP还可以使用配置文件。这允许您使用XML或YAML编写服务而不是使用PHP的定义来定义服务在上面的例子。除了最小的应用程序有意义的组织服务定义通过移动到一个或多个配置文件。要做到这一点,你还需要安装配置组件

加载XML配置文件:

1 2 3 4 5 6 7
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\加载程序\XmlFileLoader;美元containerBuilder=ContainerBuilder ();美元加载程序=XmlFileLoader (美元containerBuilder,FileLocator (__DIR__));美元加载程序- >负载(“xml”);

加载YAML配置文件:

1 2 3 4 5 6 7
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\加载程序\YamlFileLoader;美元containerBuilder=ContainerBuilder ();美元加载程序=YamlFileLoader (美元containerBuilder,FileLocator (__DIR__));美元加载程序- >负载(“services.yaml”);

请注意

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

提示

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

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

如果你想要使用PHP创建服务然后你可以移动到一个单独的配置文件和加载它以类似的方式:

1 2 3 4 5 6 7
使用ob娱乐下载\组件\配置\FileLocator;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\DependencyInjection\加载程序\PhpFileLoader;美元containerBuilder=ContainerBuilder ();美元加载程序=PhpFileLoader (美元containerBuilder,FileLocator (__DIR__));美元加载程序- >负载(“services.php”);

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

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
参数:#……mailer.transport:sendmail服务:梅勒:类:梅勒参数:[' % mailer.transport % ')欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManager电话:- - - - - -[setMailer,(' @mailer '])
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 6.0支持通过SensioLabs