DependencyInjection组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

DependencyInjection组件

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

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

安装

1
美元作曲家需要symfony /依赖项欧宝娱乐app下载地址注入

或者,您可以克隆的https://github.com/欧宝娱乐app下载地址symfony/dependency-injection存储库。

请注意

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

基本用法

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

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

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

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

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

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

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

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

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

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

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

现在梅勒服务容器中可以注入的依赖其他的类。如果你有一个欧宝app在哪里找NewsletterManager类是这样的:

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址\组件\DependencyInjection\ContainerBuilder;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元containerBuilder=ContainerBuilder ();美元containerBuilder- >setParameter (“mailer.transport”,“发送邮件”);美元containerBuilder- >注册(“梅勒”,“梅勒”)- >addArgument (“% mailer.transport %”);美元containerBuilder- >注册(“欧宝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方法:

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

你可以得到你欧宝app在哪里找newsletter_manager服务从容器中是这样的:

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

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

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

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

设置容器的配置文件

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

加载XML配置文件:

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

加载YAML配置文件:

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

请注意

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

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

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

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

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
参数:#……mailer.transport:sendmail服务:梅勒:类:梅勒参数:[' % mailer.transport % ')欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManager电话:- - - - - -[setMailer,(' @mailer '])
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。