警告:

您正在浏览文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.1.这是不再维护

考虑将您的项目升级到Symfony 5.2。欧宝娱乐app下载地址

服务容器

4.1版本

服务容器

截屏视频

你更喜欢视频教程吗?检查欧宝娱乐app下载地址Symfony基本面屏幕系列

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

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

获取和使用服务

当你启动Symfony应用时,你的容器欧宝娱乐app下载地址已经包含了许多服务。这些都是像工具等着你去利用他们。在您的控制器中,您可以通过使用服务的类或接口名称的参数类型暗示来从容器“请求”服务。想要日志某物?没问题:

/ / src /控制器/ ProductController.php/ /……PSR \ log \ loggerInterface/ *** @Route(“/产品”)* /上市函数列表LoggerInterface.美元记录器美元记录器- >信息“看!我只是使用了一项服务”);/ /……

还有哪些其他服务?通过跑步来找到答案:

12 3 4 5 6 7 8 9 10 11 12 13
php bin /控制台调试:自动装配# this is just a *small* sample of the output…========================================================== ==================================类/接口类型别名服务ID========================================================== ==================================Psr\Cache\CacheItemPoolInterface别名为“Cache .app.recorder”PSR \ log \ loggerInterface别名为“monolog.logger”欧宝娱乐app下载地址Symfony\Component\EventDispatcher\EventDispatcherInterface别名"debug.event_dispatcher"欧宝娱乐app下载地址Symfony\Component\HttpFoundation\RequestStack别名欧宝娱乐app下载地址symfony \ component \ httpfoundation \ session \ sessioninterface别名为“session”欧宝娱乐app下载地址symfony \ component \ routing \ router接口别名为“router.default”========================================================== ==================================

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

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

提示

实际上有许多容器中有更多的服务,每个服务在容器中都有一个唯一的id,比如会话或者router.default..完整的列表,你可以跑步phpbin /控制台调试:容器.但大多数时候,你不需要担心这个。看到选择特定的服务.看到如何调试服务容器和列表服务

在容器中创建/配置服务

你也可以组织你的自己的代码服务。例如,假设您需要向用户显示一个随机的、愉快的消息。如果您将此代码放入控制器中,它就不能被重用。相反,你决定创建一个新类:

/ / src /服务/ MessageGenerator.php命名空间App \ Service.MessageGenerator.上市函数getHappyMessage()美元的消息'你做到了!你更新了系统!惊人!'“这是我今天看到的最酷的更新之一!”“伟大的工作!继续前进!”];美元指数array_rand.美元的消息);返回美元的消息美元指数];

恭喜你!您已经创建了您的第一个服务类!你可以立即在控制器中使用它:

应用\ \ MessageGenerator服务上市函数MessageGenerator.$ MessageGenerator.//由于类型提示,容器将实例化一个//新消息并将它传递给您!/ /……美元的消息$ MessageGenerator.- >getHappyMessage();$这一点- >AddFlash.'成功'美元的消息);/ /……

当你要MessageGenerator.服务,容器构造一个新的MessageGenerator.对象并返回它(参见下面的边栏)。但如果你从不要求服务,那就从来没有构造:节省内存和速度。作为奖励,这个MessageGenerator.服务仅创建一次:每次要求它时都会返回相同的实例。

将服务/配置注入服务

如果您需要访问日志记录器从内部服务MessageGenerator.?没问题!创建一个__construct ()方法美元记录器LoggerInterface.type-hint。设置为新美元记录器属性并在以后使用:

/ / src /服务/ MessageGenerator.php/ /……PSR \ log \ loggerInterfaceMessageGenerator.私人美元记录器上市函数__constructLoggerInterface.美元记录器$这一点- >日志记录器美元记录器上市函数getHappyMessage()$这一点- >日志记录器- >信息“马上就能找到快乐的信息了!”);/ /……

就是这样!容器将自动知道如何通过日志记录器实例化MessageGenerator..它怎么知道这样做?自动起飞.关键是LoggerInterface.type-hint在你__construct ()方法和自动装配:真的配置在services.yaml.当您键入参数提示时,容器将自动找到匹配的服务。如果不能,您将看到一个明确的异常和一个有用的建议。

顺便说一下,这种向您添加依赖性的方法__construct ()方法被调用依赖注入.对一个简单的概念来说,这是一个可怕的术语。

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

1
php bin /控制台调试:自动装配

这个命令是你最好的朋友。这是输出的一个小子集:

类/接口类型 别名服务ID
psr \ cache \ cacheitempoolinterface “cache.app.recorder”的别名
PSR \ log \ loggerInterface “monolog.logger”的别名
欧宝娱乐app下载地址Symfony \ \ EventDispatcher \ EventDispatcherInterface组件 别名“debug.event_dispatcher”
欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RequestStack组件 别名“request_stack”
欧宝娱乐app下载地址symfony \ component \ httpfoundation \ session \ sessioninterface 别名“会话”
欧宝娱乐app下载地址symfony \ component \ routing \ routerInterface “router.default”的别名

处理多个服务

假设您还希望在每次进行站点更新时向站点管理员发送电子邮件。为此,创建一个新类:

// src /更新/ siteupdatemanager.php命名空间app \更新应用\ \ MessageGenerator服务siteupdatemanager.私人$ MessageGenerator.私人梅勒美元上市函数__constructMessageGenerator.$ MessageGenerator.\ swift_mailer.梅勒美元$这一点- >messageGenerator$ MessageGenerator.$这一点- >邮箱梅勒美元上市函数notifyOfSiteUpdate()$ happymessage.$这一点- >messageGenerator- >getHappyMessage();美元的消息\ Swift_Message“网站刚刚更新了!”)))- >setFrom(电子邮件保护)- >该太空站(电子邮件保护)- >addPart“有人更新了网站。我们告诉他们:$ happymessage.);返回$这一点- >邮箱- >发送美元的消息>0

这需要这一点MessageGenerator.Swift_Mailer服务。那没问题!事实上,这项新服务已准备好使用。在一个控制器中,例如,您可以键入新的新功能siteupdatemanager.课程并使用它:

// src / controller / sitecontroller.php/ /……应用\ \ SiteUpdateManager更新上市函数siteupdatemanager.siteUpdateManager美元/ /……如果siteUpdateManager美元- >notifyOfSiteUpdate())$这一点- >AddFlash.'成功''通知邮件发送成功');/ /……

多亏了自动装配和你的输入提示__construct (),容器创建siteupdatemanager.对象,并将正确的参数传递给它。在大多数情况下,这是完美的。

手动接线参数

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
// src/Updates/SiteUpdateManager.php //…class SiteUpdateManager{//…+私人adminEmail美元;- public function __construct(MessageGenerator $ MessageGenerator, \Swift_Mailer $mailer)+公共功能__Construct(MessageGenerator $ MessageGenerator,\ Swift_Mailer $ Mailer,$ Adminemail){/ /……+ $this->adminEmail = $adminEmail;public function notifyofsiteupdate(){// ... $ message = \ swift_message :: newinstance()// ... ...-   - > setro('(电子邮件保护)”)+  - > Storo($ this-> adminemail)/ /……;/ /……}}

如果你做了这个更改并刷新,你会看到一个错误:

无法自动服务“appupdatessiteupdatemanager”:方法“$ adminemail”的方法“__construct()”必须具有类型 - 提示或明确给出值。

这是有道理的!容器不可能知道您想在这里传递什么值。没问题!在你的配置中,你可以显式地设置这个参数:

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13
    #配置/ services.yaml服务#……#和以前一样应用程序\资源“. . / src / *”排除'../src/ {entity,migrations,最终}'#显式配置服务应用\ \ SiteUpdateManager更新争论adminEmail美元(电子邮件保护)
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--.。。--><! - 与之前一样 - >命名空间=“应用程序\”资源=“../src/*”排除=“. . / src /{实体、迁移、测试}”/><!--Explicitly configure the service --><服务ID =“app \更新\ siteupdatemanager”><参数键=“adminEmail美元”>(电子邮件保护)> < /容器
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18
    / /配置/ services.php应用\ \ SiteUpdateManager更新欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件定义//和以前一样美元的定义定义();美元的定义- >setAutowired真的- >setAutoconfigured真的- >setpublic.$这一点- >RegisterClasses.美元的定义“应用\ \”“. . / src / *”'../src/ {entity,migrations,最终}');//显式配置服务美元的容器- >getDefinitionsiteupdatemanager.::- >setArgument“adminEmail美元”(电子邮件保护));

谢谢,容器将通过manager@example.comadminEmail美元争论__construct创建时siteupdatemanager.服务。其他参数仍将是自动的。

但是,这不是脆弱吗?幸运的是,没有!如果你重命名adminEmail美元争论别的东西 - 例如mainEmail美元-你会得到一个明确的异常时,你重新加载下一页(即使该页面不使用此服务)。

服务参数

除了保存服务对象外,容器还保存配置,称为参数.要创建参数,请将其添加到参数属性并引用它% parameter_name %语法:

  • YAML
    1 2 3 4 5 6 7 8 9 10
    #配置/ services.yaml参数admin_email(电子邮件保护)服务#……应用\ \ SiteUpdateManager更新争论adminEmail美元'%admin_email%'
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><参数><参数键=“admin_email”>(电子邮件保护)> < /参数> < /参数<服务><!--.。。--><服务ID =“app \更新\ siteupdatemanager”><参数键=“adminEmail美元”>%admin_email%> < /容器
  • PHP.
    1 2 3 4 5 6 7
    / /配置/ services.php应用\ \ SiteUpdateManager更新美元的容器- >SetParameter.“admin_email”(电子邮件保护));美元的容器- >自动装配siteupdatemanager.::/ /……- >setArgument“adminEmail美元”'%admin_email%');

实际上,一旦定义了参数,就可以通过% parameter_name %语法在任何其他配置文件。许多参数在其中定义配置/ services.yaml文件。

然后你可以在服务中获取参数:

siteupdatemanager./ /……私人adminEmail美元上市函数__constructadminEmail美元$这一点- >adminemail.adminEmail美元

您还可以直接从容器中获取参数:

上市函数()/ /……// this ONLY works if you extend the base ControlleradminEmail美元$这一点- >容器- >GetParameter.“admin_email”);//或者更短的方式!// $ adminemail = $ this-> getparameter('admin_email');

有关参数的更多信息,请参阅参数简介

选择特定的服务

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

/ / src /服务/ MessageGenerator.php/ /……PSR \ log \ loggerInterfaceMessageGenerator.私人美元记录器上市函数__constructLoggerInterface.美元记录器$这一点- >日志记录器美元记录器/ /……

然而,有多个在实现的集装箱中的服务LoggerInterface.,如日志记录器monolog.logger.requestmonolog.logger.php.等。容器如何知道使用哪个?

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

  • YAML
    1 2 3 4 5 6 7 8 9 10 11
    #配置/ services.yaml服务#……代码和之前一样#显式配置服务应用\ \ MessageGenerator服务争论# @符号很重要:它告诉容器#你想传递id为'monolog.logger.request'的*service*,#而不仅仅是*字符串*'m​​onolog.logger.request'美元记录器“@monolog.logger.request”
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--.。。代码和之前一样,><!--Explicitly configure the service --><服务ID =“app \ service \ messagegenerator”><参数键=“美元记录器”类型=“服务”ID =“monolog.logger.request”/>> < /容器
  • PHP.
    1 2 3 4 5 6 7 8
    / /配置/ services.php应用\ \ MessageGenerator服务欧宝娱乐app下载地址symfony \ component \依赖等度incipt \ Refern美元的容器- >自动装配MessageGenerator.::- >setAutoconfigured真的- >setpublic.- >setArgument“美元记录器”参考“monolog.logger.request”));

这告诉容器美元记录器争论__construct应该使用id为的服务monolog.logger.request

完整的列表所有容器中可能存在的服务,运行:

1
PHP BIN / CONSOLE调试:容器

按名称或类型绑定参数

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

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    #配置/ services.yaml服务_defaults绑定#将此值传递给任何服务的$adminEmail参数#在此文件中定义(包括控制器参数)adminEmail美元(电子邮件保护)#将此服务传递给任何$ equestLogger参数在这个文件中定义的服务$ equestLogger.“@monolog.logger.request”#为任何LoggerInterface提供type-hint在这个文件中定义的服务PSR \ log \ loggerInterface“@monolog.logger.request”#……
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><违约自动装配=“真正的”autoconfigure =“真正的”公共=“假”><绑定键=“adminEmail美元”>(电子邮件保护)<绑定键=“$ equestLogger”类型=“服务”ID =“monolog.logger.request”/><绑定键=“Psr \ Log \ LoggerInterface”类型=“服务”ID =“monolog.logger.request”/><!--.。。-->> < /容器
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php应用程序控制器\ \ LuckyController欧宝娱乐app下载地址symfony \ component \依赖等度incipt \ RefernPSR \ log \ loggerInterface美元的容器- >注册LuckyController::- >setpublic.真的- >setbindings.([“adminEmail美元”=>(电子邮件保护)“requestLogger美元”=>参考“monolog.logger.request”),LoggerInterface.::=>参考“monolog.logger.request”),])

通过填写绑定关键在_defaults,可以指定的值任何理由任何在此文件中定义的服务!您可以按名称绑定参数(例如,adminEmail美元通过类型(例如)PSR \ log \ loggerInterface).

绑定Config也可以应用于特定的服务,或者一次加载多个服务(例如:通过资源一次性导入多个服务).

以服务的方式获取容器参数

4.1新版功能:在Symfony 4.1中引入了将容器参数作为服务获取的特性。欧宝娱乐app下载地址

如果某些服务或控制器需要大量的容器参数,则会更容易地替换所有这些services._defaults.bind.选项。type-hint与其具有其的任何构造函数参数欧宝娱乐app下载地址symfony \ component \ decigendency incipt \ parameterbag \ parameterbaginterface或新欧宝娱乐app下载地址Symfony \ \ DependencyInjection \ ParameterBag \ ContainerBagInterface组件对象中的所有容器参数欧宝娱乐app下载地址Symfony \ \ DependencyInjection \ ParameterBag \ ParameterBag组件对象:

/ / src /服务/ MessageGenerator.php/ /……欧宝娱乐app下载地址symfony \ component \ decigendency incipt \ parameterbag \ parameterbaginterfaceMessageGenerator.私人美元的参数上市函数__constructParameterBagInterface.美元的参数$这一点- >参数美元的参数上市函数someMethod()//从$this->params获取任何参数,它存储所有的容器参数$ Sender.$这一点- >参数- >得到“mailer_sender”);/ /……

自动装配选项

以上,这是services.yaml文件自动装配:真的在里面_defaults节,以便将其应用于该文件中定义的所有服务。控件中的类型提示参数__construct ()您服务的方法和容器将自动传递给您正确的参数。整个条目已经写过自动控制。

有关自动装配的更多细节,请查看自动定义服务依赖项(自动定义)

autoconfigure选项

以上,这是services.yaml文件AutoconFigure:真的在里面_defaults节,以便将其应用于该文件中定义的所有服务。使用此设置,容器将根据服务的配置自动将某些配置应用到您的服务.这是最常用的自动标签您的服务。

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

但是,有AutoconFigure:真的,你不需要标签。事实上,如果你用默认的服务。yaml配置,你不需要这样做任何东西:该服务将自动加载。然后,AutoconFigure.将添加Twig.extension.标签你,因为你的类实现Twig \ Extension \ ExtensionInterface.谢谢自动装配,您甚至可以在没有任何配置的情况下添加构造函数参数。

公共服务与私人服务

多亏了_defaults部分services.yaml,此文件中定义的每个服务都是公众:默认情况下。

这是什么意思?当一个服务公共,您可以直接从容器对象访问它,该对象可从扩展的任何控制器访问控制器

应用\ \ MessageGenerator服务/ /……上市函数()//容器中有一个公共的"logger"服务美元记录器$这一点- >容器- >得到'logger');MessageGenerator是一个私有服务美元的发电机$这一点- >容器- >得到MessageGenerator.::);

作为最佳实践,您应该只创建私人服务,这将自动发生。你也应该这么做使用集装箱- > get ()方法获取公共服务。

但是,如果你需要将服务公开,重写上市环境:

  • YAML
    1 2 3 4 5 6 7
    #配置/ services.yaml服务#……代码和之前一样#显式配置服务应用\ \ MessageGenerator服务上市真的
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--.。。代码和之前一样,><!--Explicitly configure the service --><服务ID =“app \ service \ messagegenerator”公共=“真正的”> < /服务>> < /容器

通过资源一次性导入多个服务

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

  • YAML
    1 2 3 4 5 6 7 8 9
    #配置/ services.yaml服务#……#使src/中的类可以作为服务使用#这将为每个id为完全限定类名的类创建一个服务应用程序\资源“. . / src / *”排除'../src/ {entity,migrations,最终}'
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--.。。-->命名空间=“应用程序\”资源=“../src/*”排除=“. . / src /{实体、迁移、测试}”/>> < /容器
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13
    / /配置/ services.php欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件定义//用作默认模板美元的定义定义();美元的定义- >setAutowired真的- >setAutoconfigured真的- >setpublic.$这一点- >RegisterClasses.美元的定义“应用\ \”“. . / src / *”'../src/ {entity,migrations,最终}');

提示

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

这可用于快速使许多类作为服务可用,并应用一些默认配置。的id每个服务的完全限定类名。你可以使用下面的id(类名)来覆盖任何导入的服务(例如,参见手动接线参数).如果你覆盖了一个服务,没有一个选项(例如。上市)继承自导入(但被覆盖的服务仍然继承自_defaults).

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

请注意

等等,这是不是意味着每一个SRC /注册为服务?甚至模型课程?实际上,没有。只要你有公众:在你的_defaults密钥(或者可以将其添加到特定导入下),所有导入的服务都是私人.多亏了这个,所有的班级SRC /这是显式用作服务将自动从最终容器中删除。实际上,进口意味着所有课程都是“可用的使用作为服务,不需要手动配置。

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

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

1 2 3 4 5
#配置/ services.yaml服务应用程序域\ \资源'../src/domain/*'#……

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

1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务command_handlers命名空间应用程序域\ \资源“. . / src /域/ * / CommandHandler '标签command_handlerevent_subscribers.命名空间应用程序域\ \资源'../src/domain/*/eventsubscriber'标签event_subscriber

显式配置服务和参数

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

这两个特性都是可选的。即使您使用它们,也可能在某些情况下需要手动连接服务。例如,假设您想要注册2服务siteupdatemanager.类——每个类都有不同的管理电子邮件。在这种情况下,每个服务都需要有一个唯一的服务id:

  • YAML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
    #配置/ services.yaml服务#……#这是服务idsite_update_manager.superadmin.应用\ \ SiteUpdateManager更新#你仍然可以使用自动控制:我们只想展示它的样子自动装配#手动连接所有参数争论-“@App \ \ MessageGenerator服务”-“@mailer”-(电子邮件保护)site_update_manager.normal_users应用\ \ SiteUpdateManager更新自动装配争论-“@App \ \ MessageGenerator服务”-“@mailer”-(电子邮件保护)#创建一个别名,默认情况下,如果你键入提示SiteUpdateManager,# site_update_manager。超级管理员应用\ \ SiteUpdateManager更新'@ site_update_manager.superadmin'
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    <!--config/services.xml -->< ?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/serviceshttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!--.。。--><服务ID =“site_update_manager.superadmin”类=“app \更新\ siteupdatemanager”自动装配=“假”><参数类型=“服务”ID =“app \ service \ messagegenerator”/><参数类型=“服务”ID =“梅勒”/><参数>(电子邮件保护)<服务ID =“site_update_manager.normal_users”类=“app \更新\ siteupdatemanager”自动装配=“假”><参数类型=“服务”ID =“app \ service \ messagegenerator”/><参数类型=“服务”ID =“梅勒”/><参数>(电子邮件保护)<服务ID =“app \更新\ siteupdatemanager”别名=“site_update_manager.superadmin”/>> < /容器
  • PHP.
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / /配置/ services.php应用\ \ SiteUpdateManager更新应用\ \ MessageGenerator服务欧宝娱乐app下载地址symfony \ component \依赖等度incipt \ Refern美元的容器- >注册“site_update_manager.superadmin”siteupdatemanager.::- >setAutowired- >setArguments([参考MessageGenerator.::),参考'邮件'),(电子邮件保护)]);美元的容器- >注册“site_update_manager.normal_users”siteupdatemanager.::- >setAutowired- >setArguments([参考MessageGenerator.::),参考'邮件'),(电子邮件保护)]);美元的容器- >塞拉里亚斯siteupdatemanager.::“site_update_manager.superadmin”

在这种情况下,两个服务注册:site_update_manager.superadmin.site_update_manager.normal_users.多亏了别名,如果你输入提示siteupdatemanager.第一个(site_update_manager.superadmin.)将通过。如果你想通过第二关,你就得手动连接服务

谨慎

如果你做创建别名和are从SRC装入所有服务/,然后三个服务已经创建(自动服务+你的两个服务),自动加载的服务将被传递-默认情况下-当你键入提示siteupdatemanager..这就是为什么创造别名是一个好主意。

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0许可证。