《交响乐5:快车道》的封面欧宝娱乐app下载地址

欧宝娱乐app下载地址Symfony 5:快速轨道是学习现代Symfony发展,从零到生产的最好书籍。欧宝娱乐app下载地址+300页展示Symfony与Docker,欧宝娱乐app下载地址 api,队列和异步任务,Webpack, spa等。

DependencyInjection组件

DependencyInjection组件

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

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

安装

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

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php代码中的文件以启用Composer提供的类自动加载机制。读本文为更多的细节。

基本用法

另请参阅

本文介绍了如何在任何PHP应用程序中使用依赖度注入功能作为独立组件。阅读服务容器文章了解如何在Symfony应用程序中使用它。欧宝娱乐app下载地址

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

梅勒{私人$运输;上市函数__construct(){$这一点->运输='发送邮件';}// ......}

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

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;$ ContainerBuilder.=ContainerBuilder();$ ContainerBuilder.->注册(“梅勒”,“梅勒”);

对类的改进使其更灵活地将允许容器设置运输用过的。如果更改类,则将其传递到构造函数:

梅勒{私人$运输;上市函数__construct($运输){$这一点->运输=$运输;}// ......}

然后您可以设置在集装箱内运输的选择:

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;$ ContainerBuilder.=ContainerBuilder();$ ContainerBuilder.->注册(“梅勒”,“梅勒”)->addArgument('发送邮件');

此类现在更灵活,因为您将运输的选择分开,并进入容器。

您选择的邮件传输可能是其他服务需要了解的其他服务。您可以避免在容器中的参数,然后参考此参数,以避免在多个地方更改它梅勒服务的构造函数参数:

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;$ ContainerBuilder.=ContainerBuilder();$ ContainerBuilder.->setParameter(“mailer.transport”,'发送邮件');$ ContainerBuilder.->注册(“梅勒”,“梅勒”)->addArgument(“% mailer.transport %”);

现在邮箱Service在容器中,你可以将它作为其他类的依赖项注入。如果你有欧宝app在哪里找NewsletterManager像这样的课程:

欧宝app在哪里找NewsletterManager{私人梅勒美元;上市函数__construct(\邮件梅勒美元){$这一点->邮箱=梅勒美元;}// ......}

在定义这一点时欧宝app在哪里找newsletter_manager服务,邮箱服务还不存在。使用参考类来告诉容器注入邮箱服务初始化新闻通讯管理器时:欧宝app在哪里找

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件参考;$ ContainerBuilder.=ContainerBuilder();$ ContainerBuilder.->setParameter(“mailer.transport”,'发送邮件');$ ContainerBuilder.->注册(“梅勒”,“梅勒”)->addArgument(“% mailer.transport %”);$ ContainerBuilder.->注册(“欧宝app在哪里找newsletter_manager”,“欧宝app在哪里找NewsletterManager”)->addArgument(参考(“梅勒”));

如果欧宝app在哪里找NewsletterManager没有要求梅勒并注入它只是可选的,那么您可以使用Setter注入:

欧宝app在哪里找NewsletterManager{私人梅勒美元;上市函数setMailer(\邮件梅勒美元){$这一点->邮箱=梅勒美元;}// ......}

你现在可以选择不注明一个梅勒欧宝app在哪里找NewsletterManager。如果您确实想要的话,那么容器可以调用Setter方法:

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件参考;$ ContainerBuilder.=ContainerBuilder();$ ContainerBuilder.->setParameter(“mailer.transport”,'发送邮件');$ ContainerBuilder.->注册(“梅勒”,“梅勒”)->addArgument(“% mailer.transport %”);$ ContainerBuilder.->注册(“欧宝app在哪里找newsletter_manager”,“欧宝app在哪里找NewsletterManager”)->addMethodCall(“setMailer”,(参考(“梅勒”)));

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

使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;$ ContainerBuilder.=ContainerBuilder();// ......n欧宝app在哪里找ewsletterManager美元=$ ContainerBuilder.->得到(“欧宝app在哪里找newsletter_manager”);

避免代码依赖于容器

虽然您可以直接从容器中检索服务,最好最大限度地减少此功能。例如,在欧宝app在哪里找NewsletterManager你注射邮箱服务而不是从容器中询问它。您可以注入容器并检索邮箱从中服务,但它会被绑在这个特定的容器中,使得难以在其他地方重复使用课程。

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

使用配置文件设置容器

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

加载XML配置文件:

使用欧宝娱乐app下载地址Symfony \ \ Config \ FileLocator组件;使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;使用欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \ Loader \ XMLFileLoader;$ ContainerBuilder.=ContainerBuilder();$ loader.=XmlFileLoader($ ContainerBuilder.,FileLocator.(__dir__));$ loader.->负载(“xml”);

加载yaml配置文件:

使用欧宝娱乐app下载地址Symfony \ \ Config \ FileLocator组件;使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;使用欧宝娱乐app下载地址Symfony \组件\ DependencyInjection \装载机\ YamlFileLoader;$ ContainerBuilder.=ContainerBuilder();$ loader.=YamlFileLoader($ ContainerBuilder.,FileLocator.(__dir__));$ loader.->负载(“services.yaml”);

请注意

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

提示

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

// ......$ loader.->负载('services.config',“xml”);

如果你想要使用PHP来创建服务,然后您可以将其移动到单独的配置文件中并以类似的方式加载它:

使用欧宝娱乐app下载地址Symfony \ \ Config \ FileLocator组件;使用欧宝娱乐app下载地址symfony \ component \ decigendencyIngreation \ containerBuilder;使用欧宝娱乐app下载地址Symfony \ Component \ DependencyIngress \ Loader \ PhpFileLoader;$ ContainerBuilder.=ContainerBuilder();$ loader.=phpfileloader.($ ContainerBuilder.,FileLocator.(__dir__));$ loader.->负载(“services.php”);

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

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11 12
    参数:#……mailer.Transport.:发送邮件服务:邮箱::梅勒争论:(“% mailer.transport %”]欧宝app在哪里找newsletter_manager::欧宝app在哪里找NewsletterManager调用:-setMailer:(“@mailer”]
  • XML.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    < ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”XSI:Schemalocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><参数><! -  ...  - ><参数关键=“mailer.transport”>发送邮件> < /参数<服务><服务ID =“梅勒”类=“梅勒”><参数>%mailer.transport%<服务ID =“欧宝app在哪里找newsletter_manager”类=“欧宝app在哪里找newslettermanager”><呼叫方法=“setmailer”><争论类型=“服务”ID =“梅勒”/>< / >电话> < /服务
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    命名空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器;返回函数(containerconfigurator美元配置器){美元配置器->参数()// ......->(“mailer.transport”,'发送邮件');$服务=美元配置器->服务();$服务->(“梅勒”,“梅勒”)//参数()方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址->arg游戏([帕纳(“mailer.transport”)));$服务->(“欧宝app在哪里找newsletter_manager”,“欧宝app在哪里找NewsletterManager”)//在Embfony之前的版本中5.1服务()函数称欧宝娱乐app下载地址为ref()->称呼(“setMailer”,(服务(“梅勒”)));};

这项工作包括代码样本,是在a下获得的许可创作共用BY-SA 3.0许可证。