服务容器

5.3版本
欧宝娱乐app下载地址symfony 5.3支持经过乔利德

服务容器

截图

你更喜欢视频教程吗?看看欧宝娱乐app下载地址Symfony基础知识扫描系列

您的申请是满的有用的对象:一个“邮件”对象可能会帮助您发送电子邮件,而另一个对象可能会帮助您将内容保存到数据库。几乎一切您的应用程序“确实”实际上是由其中一个对象完成的。每次安装新捆绑包时,您都可以访问甚至更多!

在sy欧宝娱乐app下载地址mfony中,调用这些有用的对象服务每个服务都在一个叫做的非常特殊的对象内服务容器。容器允许您集中构建对象的方式。它让您的生活更轻松,促进强大的建筑,超快!

获取和使用服务

你开始一个symfony app的那一刻,你的欧宝娱乐app下载地址容器已经包含许多服务。这些就像工具:等你利用他们。在您的控制器中,您可以通过暗示使用服务的类或接口名称的参数“询问”从容器中的服务。想要日志某物?没问题:

// src / controller / productController.php命名空间App \ Controller.;PSR \ log \ loggerInterface;欧宝娱乐app下载地址symfony \ component \ httpfoundation \ response;班级ProductController.{/ *** @route(“/ products”)* /民众功能列表LoggerInterface.$ logger.回复{$ logger.- >信息“看,我只是用过服务!”);// ......}}

其他服务可用吗?通过运行方式查找:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
$PHP BIN / CONSOLE调试:AUTOWIRING#这只是一个*小*输出样本......描述了一个记录器实例。PSR \ log \ loggerInterface(monolog.logger)请求堆栈控制请求的生命周期。欧宝娱乐app下载地址symfony \ component \ httpfoundation \ lequeststack(request_stack)routerInterface是所有路由器类必须实现的接口。欧宝娱乐app下载地址symfony \ component \ routing \ routerInterface(router.default)[...]

当您在控制器方法中或在您的内部使用这些类型 - 提示时自己的服务,S欧宝娱乐app下载地址ymfony将自动传递您与该类型匹配的服务对象。

在整个文档中,您将看到如何使用居住在容器中的许多不同服务。

提示

实际上有许多容器中的更多服务,每个服务都有一个唯一的ID,就像Request_stack.或者router.default.。对于完整列表,您可以运行PHP.垃圾箱/控制台调试:容器。但大多数时候,你不需要担心这个。看选择特定的服务。看如何调试服务容器和列表服务

在容器中创建/配置服务

你也可以组织你的自己的代码进入服务。例如,假设您需要向用户显示随机的快乐消息。如果将此代码放在控制器中,则无法重新使用。相反,您决定创建一个新类:

// src / service / messagegenerator.php命名空间App \ Service.;班级MessageGenerator.{民众功能gethappymessage.()细绳{$消息=['你做到了!你更新了系统!惊人的!'“这是我一整天都看到的最酷的更新之一!”'做得好!继续!'];$ index.=array_rand.$消息);返回$消息[$ index.];}}

恭喜!您已创建了您的第一个服务课程!您可以立即在控制器内使用它:

// src / controller / productController.phpApp \ Service \ MessageGenerator;欧宝娱乐app下载地址symfony \ component \ httpfoundation \ response;/ *** @Route(“/产品/新”)* /民众功能新的MessageGenerator.$ MessageGenerator.回复{//由于暗示,容器将实例化一个//新消息并将它传递给您!// ......$消息=$ MessageGenerator.- >gethappymessage.();$这一点- >AddFlash.'成功'$消息);// ......}

当你要求的时候MessageGenerator.服务,容器构建一个新的MessageGenerator.对象并返回它(请参阅下面的侧栏)。但如果你从未要求过服务,那就是绝不构造:保存内存和速度。作为奖金,MessageGenerator.服务仅创建一次:每次要求它时都会返回相同的实例。

将服务/配置注入服务

如果您需要访问该怎么办记录器从内部服务MessageGenerator.还是没问题!创建一个__构造()方法用A.$ logger.有的论点LoggerInterface.类型提示。将此设置为新的$ logger.属性并稍后使用它:

// src / service / messagegenerator.php命名空间App \ Service.;PSR \ log \ loggerInterface;班级MessageGenerator.{私人的$ logger.;民众功能__构造LoggerInterface.$ logger.{$这一点- >记录器=$ logger.;}民众功能gethappymessage.()细绳{$这一点- >记录器- >信息“即将找到一个快乐的信息!”);// ......}}

就是这样!容器将是自动地知道通过记录器在实例化时服务MessageGenerator.。它怎么知道这样做?自动起飞。关键是LoggerInterface.在你的中键入__构造()方法和方法aproire:真的配置服务.Yaml.。当您键入暗示参数时,容器将自动查找匹配的服务。如果不能,你会看到一个明确的例外,有助于有用的建议。

顺便说一下,这种向您添加依赖性的方法__构造()方法被调用依赖注入

你应该怎么知道使用LoggerInterface.对于类型 - 提示?您可以通过运行来读取您使用的任何功能的文档,或者通过运行获取可自动使用的类型 - 提示列表:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
$PHP BIN / CONSOLE调试:AUTOWIRING#这只是一个*小*输出样本......描述了一个记录器实例。PSR \ log \ loggerInterface(monolog.logger)请求堆栈控制请求的生命周期。欧宝娱乐app下载地址symfony \ component \ httpfoundation \ lequeststack(request_stack)routerInterface是所有路由器类必须实现的接口。欧宝娱乐app下载地址symfony \ component \ routing \ routerInterface(router.default)[...]

处理多种服务

假设您还要每次制作网站更新时都要通过电子邮件发送站点管理员。为此,您可以创建一个新的类:

// src / service / siteupdatemanager.php命名空间App \ Service.;App \ Service \ MessageGenerator;欧宝娱乐app下载地址symfony \ component \ mailer \ mailerInterface;欧宝娱乐app下载地址symfony \ component \ mime \电子邮件;班级siteupdatemanager.{私人的$ MessageGenerator.;私人的$邮箱;民众功能__构造MessageGenerator.$ MessageGenerator.mailerInterface.$邮箱{$这一点- >MessageGenerator.=$ MessageGenerator.;$这一点- >邮箱=$邮箱;}民众功能notifyofsiteupdate.()BOOL.{$ happymessage.=$这一点- >MessageGenerator.- >gethappymessage.();$电子邮件=新的电子邮件())- >'[电子邮件受保护]'- >'[电子邮件受保护]'- >主题'网站更新刚刚发生!'- >文本“有人刚刚更新了该网站。我们告诉他们:'$ happymessage.);$这一点- >邮箱- >发送$电子邮件);// ......返回真的;}}

这需要这一点MessageGenerator.邮箱服务。这没问题,我们通过类型暗示他们的类和接口名称来询问它们!现在,这项新服务已准备好使用。在一个控制器中,例如,您可以键入新的新功能siteupdatemanager.课程并使用它:

// src / controller / sitecontroller.php命名空间App \ Controller.;app \ service \ siteupdatemanager;// ......班级SiteController.延伸AbstractController.{民众功能新的siteupdatemanager.$ siteupdatemanager.{// ......如果$ siteupdatemanager.- >notifyofsiteupdate.()){$这一点- >AddFlash.'成功''通知邮件已成功发送。');}// ......}}

感谢自动控制和您的类型 - 提示__构造(),容器创造了siteupdatemanager.对象并将其传递正确的参数。在大多数情况下,这完全有效。

手动接线参数

但是当服务的参数无法自动时,有一些情况。例如,假设要使管理员电子邮件可配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 15 16 18 19 20 21 21 22 23 22 22 22 27 22 22 22
// src / service / siteupdatemanager.php // ... class siteupdatemanager {// ...+私人$ adminemail;- 公共功能__Construct(MessageGenerator $ MessageGenerator,MailerInterface $ Mailer)+公共功能__Construct(MessageGenerator $ MessageGenerator,MailerInterface $ Mailer,String $ Adminemail){// ......+ $ this-> adminemail = $ adminemail;}公共功能NotifyOfSiteUpdate():Bool {// ... $ Email =(新电子邮件())// ... ...- >到('[电子邮件受保护]')+  - >至($ this-> adminemail)// ......;// ...}}

如果您更改并刷新,您会看到错误:

无法自动服务“app \ service \ siteupdatemanager”:方法“$ adminemail”的方法“__construct()”必须具有型号或明确给出值。

那讲得通!该容器无法知道您想要在此处传递的价值。没问题!在配置中,您可以显式设置此参数:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    #配置/服务.YAML服务# ... 和之前一样# 和之前一样应用程序\资源'../src/*'排除'../src/ {dependenceIngexting,Entity ,tests ,kernel.php}'#显式配置服务app \ service \ siteupdatemanager争论$ adminemail.'[电子邮件受保护]'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ......和之前一样 - ><! - 与之前一样 - >命名空间=“应用程序\”资源=“../src/*”排除=“../src//><! - 显式配置服务 - ><服务ID =“app \ service \ siteupdatemanager”><争论键=“$ adminemail”>[电子邮件受保护]
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;app \ service \ siteupdatemanager;返回功能containerconfigurator$ Configurator.{// ......// 和之前一样$服务- >加载'应用程序\\''../src/*'- >排除'../src/ {dependenceIngexting,Entity ,tests ,kernel.php}');$服务- >siteupdatemanager.::班级- >arg'$ adminemail''[电子邮件受保护]';};

谢谢,容器将通过Manager@example.com.到了$ adminemail.争论__构造创建时siteupdatemanager.服务。其他参数仍将是自动的。

但是,这不是脆弱吗?幸运的是,没有!如果你重命名$ adminemail.争论别的东西 - 例如$ mainemail.- 当您重新加载下一页时,您将获得一个明确的例外(即使该页面不使用此服务)。

服务参数

除了保持服务对象外,容器还包含配置,调用参数。关于symfony配置的主要文章介绍了欧宝娱乐app下载地址配置参数详细展示并显示其所有类型(String,Boolean,阵列,二进制和PHP常量参数)。

但是,还有与服务相关的另一种类型的参数。在Yaml Config中,任何开头的字符串@被视为服务的ID,而不是常规字符串。在XML配置中,使用type =“服务”输入参数和PHP Config使用服务()功能:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11
    #配置/服务.YAML服务App \ Service \ MessageGenerator争论#这不是一个字符串,而是对一个名为'logger'的服务的引用-'@logger'#如果字符串参数的值以'@'开头,则需要转义#它通过添加另一个'@',所以symfony不会认为它是一项欧宝娱乐app下载地址服务#下面的示例将被解析为字符串'@securepassword'# - '@@ securePassword'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><服务ID =“app \ service \ messagegenerator”><争论类型=“服务”ID =“记录器”/>
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;App \ Service \ MessageGenerator;返回功能containerconfigurator$ Configurator.{$服务=$ Configurator.- >服务();$服务- >MessageGenerator.::班级//在Embfony之前的版本中5.1服务()函数称欧宝娱乐app下载地址为ref()- >args.([服务'logger')]);};

使用容器的访问器方法与容器参数一起使用参数:

//检查是否定义了参数(参数名称区分大小写)$容器- >有公差集团'mailer.transport');//获取参数的值$容器- >GetParameter.'mailer.transport');//添加一个新参数$容器- >SetParameter.'mailer.transport''发邮件');

警告

使用过的符号是A.欧宝娱乐app下载地址Symfony公约使参数更容易阅读。参数是扁平键值元素,它们无法组织成嵌套数组

笔记

您只能在编译容器之前设置一个参数,而不是运行时。要了解更多关于编译容器的信息编译容器

选择特定的服务

MessageGenerator.先前创建的服务需要一个LoggerInterface.争论:

// src / service / messagegenerator.php命名空间App \ Service.;PSR \ log \ loggerInterface;班级MessageGenerator.{私人的$ logger.;民众功能__构造LoggerInterface.$ logger.{$这一点- >记录器=$ logger.;}// ......}

但是,有在实现的集装箱中的服务LoggerInterface., 如记录器monolog.logger.request.monolog.logger.php.等等容器如何知道哪一个使用?

在这些情况下,容器通常配置为自动选择其中一个服务 -记录器在这种情况下(阅读更多关于为什么使用别名来启用自动控制)。但是,您可以控制其并通过不同的记录器传递:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11
    #配置/服务.YAML服务#...与之前的代码相同#显式配置服务App \ Service \ MessageGenerator争论#'@'符号很重要:这就是告诉容器的原因#你想通过*服务*谁的ID是'monolog.logger.request',#而不仅仅是*字符串*'m​​onolog.logger.request'$ logger.'@ monolog.logger.request'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ...与之前的代码相同 - ><! - 显式配置服务 - ><服务ID =“app \ service \ messagegenerator”><争论键=“$ logger”类型=“服务”ID =“monolog.logger.request”/>
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;App \ Service \ MessageGenerator;返回功能containerconfigurator$ Configurator.{// ...与以前一样的代码//显式配置服务$服务- >MessageGenerator.::班级- >arg'$ logger'服务'monolog.logger.request')));};

这告诉容器$ logger.争论__构造应该使用其ID的服务monolog.logger.request.

对于全部列表全部容器中可能的服务,运行:

1
$PHP BIN / CONSOLE调试:容器

按名称或类型绑定参数

你也可以使用捆绑关键字按名称或类型绑定特定参数:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21 22
    #配置/服务.YAML服务_defaults.捆绑#将此值传递给任何服务的任何$ adminemail参数#在此文件中定义(包括控制器参数)$ adminemail.'[电子邮件受保护]'#将此服务传递给任何$ equestLogger参数#服务在此文件中定义$ equestLogger.'@ monolog.logger.request'#传递此服务的任何LoggerInterface类型-Teply#服务在此文件中定义PSR \ log \ loggerInterface'@ monolog.logger.request'#(可选)您可以定义要匹配的参数的名称和类型string $ adminemail.'[电子邮件受保护]'PSR \ log \ loggerInterface $ equestLogger'@ monolog.logger.request'可拍卖的$规则!tagged_iterator.app.foo.rule.#...
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 23 22 23 23 29 32 32 32 32 32 33 34
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><默认值autowire =.“真的”autoconfigure =“真的”公共=“错误的”>键=“$ adminemail”>[电子邮件受保护]键=“$ equestLogger”类型=“服务”ID =“monolog.logger.request”/>键=“psr \ log \ loggerInterface”类型=“服务”ID =“monolog.logger.request”/><! - 可选地,您可以定义要匹配的参数的名称和类型 - >键=“string $ adminemail”>[电子邮件受保护]键=“PSR \ log \ loggerInterface $ equestLogger”类型=“服务”ID =“monolog.logger.request”/>键=“可迭代$规则”类型=“tagged_iterator”标签=“app.foo.rule”/><! -  ...  - >
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 23 29 29 29 29 29 29 32 32
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;app \ controller \ luckycontroller;PSR \ log \ loggerInterface;欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义;欧宝娱乐app下载地址symfony \ component \依赖等度incipt \ Refern;返回功能containerconfigurator$ Configurator.{$服务=$ Configurator.- >服务()- >默认值()//将此值传递给任何服务的任何$ adminemail参数//在此文件中定义(包括控制器参数)- >捆绑'$ adminemail''[电子邮件受保护]'//将此服务传递给任何$ equestLogger参数//在此文件中定义的服务- >捆绑'$ quyectlogger'服务'monolog.logger.request')))//传递此服务的任何LoggerInterface类型 - 提示//在此文件中定义的服务- >捆绑LoggerInterface.::班级服务'monolog.logger.request')))//可选地,您可以定义要匹配的参数的名称和类型- >捆绑'string $ adminemail''[电子邮件受保护]'- >捆绑LoggerInterface.::班级'$ quyectlogger'服务'monolog.logger.request')))- >捆绑'可拍卖$规则'tagged_iterator.'app.foo.rule')));// ......};

通过填写捆绑钥匙_defaults.,您可以指定值任何争论任何在此文件中定义的服务!您可以按名称绑定参数(例如,$ adminemail.),按类型(例如PSR \ log \ loggerInterface或两者(例如PSR \ log \ loggerInterface$ equestLogger.)。

捆绑Config也可以应用于特定服务或一次加载许多服务时(即一次使用资源导入许多服务)。

autowire选项

以上,这是服务.Yaml.文件有aproire:真的在里面_defaults.部分使其适用于该文件中定义的所有服务。使用此设置,您可以在键入 - 提示中键入__构造()您服务的方法和容器将自动传递给您正确的参数。整个条目已经写过自动控制。

有关Autowiring的更多详细信息,请退房自动定义服务依赖项(自动定义)

autoconfigure选项

以上,这是服务.Yaml.文件有AutoconFigure:真的在里面_defaults.部分使其适用于该文件中定义的所有服务。使用此设置,容器将根据您的服务自动对您的服务应用某些配置班级。这主要是用来自动标签您的服务。

例如,要创建枝条扩展,您需要创建一个类,将其注册为服务,以及标签Twig.extension.

但是,有AutoconFigure:真的,您不需要标签。事实上,如果你使用的话默认服务.YAML CONFIG.,你不需要做任何事物:该服务将自动加载。然后,AutoconFigure.将添加Twig.extension.标签为了你,因为你的课程工具Twig \ Extension \ ExtensionInterface。谢谢aproire.,您甚至可以在没有任何配置的情况下添加构造函数参数。

Linting Service定义

棉绒:容器命令检查注入服务的参数是否匹配其类型声明。在将应用程序部署到生产之前运行它是有用的(例如,在您的持续集成服务器中):

1
$PHP箱/控制台棉绒:容器

在编译容器时检查所有服务参数的类型是否可以损害性能。这就是为什么这种类型检查在a中实现的原因编译器通过checktypedeclarationspass默认情况下禁用,仅在执行时启用棉绒:容器命令。如果您不介意性能损失,请在您的应用程序中启用编译器传递。

公众与私人服务

默认情况下,定义的每个服务都是私有的。当服务私有时,您无法直接从容器访问它$ contains-> get()。作为最好的练习,你应该只创造私人的服务,您应该使用依赖注入而不是使用$ contains-> get()

如果您需要懒惰地获取服务,而不是使用您应该考虑使用的公共服务服务定位器

但是,如果你需要公开服务,覆盖民众环境:

  • yaml.
    1 2 3 4 5 6 7
    #配置/服务.YAML服务#...与之前的代码相同#显式配置服务App \ Service \ PublicService民众真的
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ...与之前的代码相同 - ><! - 显式配置服务 - ><服务ID =“app \ service \ publicservice”公共=“真的”> 
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;App \ Service \ PublicService;返回功能containerconfigurator$ Configurator.{// ...与代码相同//显式配置服务$服务- >服务\ PublicService.::班级- >民众();};

自版本5.1以来已弃用:AS Sym欧宝娱乐app下载地址fony 5.1,不再可以通过类型暗示自动PSR \ Container \ ContainerInterface

一次使用资源导入许多服务

您已经看到,您可以使用中使用一次进口许多服务资源钥匙。例如,默认symfony配置包含:欧宝娱乐app下载地址

  • yaml.
    1 2 3 4 5 6 7 8 9
    #配置/服务.YAML服务# ... 和之前一样#在SRC /可用的课程可用作服务#这创建每个类的服务,其ID是完全限定的类名应用程序\资源'../src/*'排除'../src/ {dependenceIngexting,Entity ,tests ,kernel.php}'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ......和之前一样 - >命名空间=“应用程序\”资源=“../src/*”排除=“../src//>
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;返回功能containerconfigurator$ Configurator.{// ......//使SRC /可用的课程用作服务//这为每个类创建一个服务,其ID是完全限定的类名$服务- >加载'应用程序\\''../src/*'- >排除'../src/ {dependenceIngexting,Entity ,tests ,kernel.php}');};

提示

价值资源排除选项可以是任何有效的glob pattern.

这可用于快速使许多类作为服务可用,并应用一些默认配置。这ID每个服务都是其完全合格的类名。您可以使用下面的ID(类名)覆盖导入的任何服务(例如,参见手动接线参数)。如果您覆盖服务,则不包含选项(例如,民众)从导入中继承(但覆盖服务仍然继承自_defaults.)。

你也可以排除某些路径。这是可选的,但会略微提高性能开发环境:未跟踪排除路径,因此修改它们不会导致容器重建。

笔记

等等,这是否意味着每一个班上SRC /注册为服务?甚至模型课程?实际上,没有。只要您将导入的服务保留为私人的,所有课程SRC /那是不是显式用作服务将自动从最终容器中删除。实际上,进口意味着所有课程都是“可用的用过的作为服务“无需手动配置。

使用相同名称空间的多个服务定义

如果使用YAML配置格式定义服务,则PHP命名空间用作每个配置的键,因此您无法为同一名称空间下的类定义不同的服务配置:

  • yaml.
    1 2 3 4 5
    #配置/服务.YAML服务app \ domain \资源'../src/domain/*'#...
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务>命名空间=“app \域”资源=“../src/app/domain/*”/><! -  ...  - >
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    // config / services.php欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \定义;$默认值=新的定义();// $这是对当前装载机的引用$这一点- >RegisterClasses.$默认值'app \\ domain \\''../src/app/domain/*');// ......

为了有多个定义,添加命名空间选项并使用任何唯一字符串作为每个服务配置的密钥:

1 2 3 4 5 6 7 8 9 10 11
#配置/服务.YAML服务command_handlers.命名空间app \ domain \资源'../src/domain/*/commandhandler'标签[command_handler.]event_subscribers.命名空间app \ domain \资源'../src/domain/*/eventsubscriber'标签[event_subscriber.]

显式配置服务和参数

在Symfony 欧宝娱乐app下载地址3.3之前,明确配置所有服务和(通常)参数:无法实现自动加载服务自动起飞不太常见。

这两个功能都是可选的。即使您使用它们,也可能有些情况下您想要手动线提供服务。例如,假设您要注册2服务服务siteupdatemanager.类 - 每次带有不同的管理员电子邮件。在这种情况下,每个都需要具有唯一的服务ID:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 24 25 22
    #配置/服务.YAML服务#...#这是服务的IDsite_update_manager.superadmin.班级app \ service \ siteupdatemanager#你仍然可以使用自动控制:我们只想展示它的样子aproire.错误的#手动线路所有参数争论-'@app \ service \ messagegenerator'-'@mailer'-'[电子邮件受保护]'site_update_manager.normal_users.班级app \ service \ siteupdatemanageraproire.错误的争论-'@app \ service \ messagegenerator'-'@mailer'-'[电子邮件受保护]'#创建一个别名,所以 - 默认情况下 - 如果键入-hint siteupdatemanager,#site_update_manager.superadmin将被使用app \ service \ siteupdatemanager'@ site_update_manager.superadmin'
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 24 24 22
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ...  - ><服务ID =“site_update_manager.superadmin”类=“app \ service \ siteupdatemanager”autowire =.“错误的”><争论类型=“服务”ID =“app \ service \ messagegenerator”/><争论类型=“服务”ID =“邮件”/><参数>[电子邮件受保护]<服务ID =“site_update_manager.normal_users”类=“app \ service \ siteupdatemanager”autowire =.“错误的”><争论类型=“服务”ID =“app \ service \ messagegenerator”/><争论类型=“服务”ID =“邮件”/><参数>[电子邮件受保护]<服务ID =“app \ service \ siteupdatemanager”别名=“site_update_manager.superadmin”/>
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 15 16 18 19 20 21 21 22 23 23 22 29 29 29 29 29 29 30 32 31 32
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;App \ Service \ MessageGenerator;app \ service \ siteupdatemanager;返回功能containerconfigurator$ Configurator.{// ......// site_update_manager.superadmin是服务的ID$服务- >'site_update_manager.superadmin'siteupdatemanager.::班级//你仍然可以使用自动控制:我们只想展示它的样子- >aproire.错误的//手动线路所有参数- >args.([服务MessageGenerator.::班级),服务'邮件'),'[电子邮件受保护]']);$服务- >'site_update_manager.normal_users'siteupdatemanager.::班级- >aproire.错误的- >args.([服务MessageGenerator.::班级),服务'邮件'),'[电子邮件受保护]']);//创建一个别名,所以 - 默认情况下 - 如果您键入-hint siteupdatemanager,//将使用site_update_manager.superadmin$服务- >别名siteupdatemanager.::班级'site_update_manager.superadmin');};

在这种情况下,服务注册:site_update_manager.superadmin.site_update_manager.normal_users.。由于别名,如果你键入 - 提示siteupdatemanager.首先 (site_update_manager.superadmin.)将通过。如果你想通过第二个,你需要手动线路服务

警告

如果你做了不是创造别名并且是从SRC装入所有服务/, 然后已创建服务(自动服务+您的两个服务)和自动加载的服务将通过 - 默认情况 - 键入 - 键入 - 提示时siteupdatemanager.。这就是为什么创造别名是一个好主意。

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。