如何装修服务
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.0,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
如何装修服务
覆盖现有的定义时,原始服务丢失:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:~#这替换旧应用程序\梅勒与新的定义,#老定义是迷路了App \梅勒:类:App \ NewMailer
1 2 3 4 5 6 7 8 9 10 11 12 13 14
< !——配置/服务。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsd=“http://www.w3.org/2001/XMLSchema-instance”xsd: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\梅勒”/ >< !——这替换旧应用程序\梅勒与新的定义,旧的定义是失去- - ><服务id=“应用程序\梅勒”类=“应用程序\ NewMailer”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\梅勒;使用应用程序\NewMailer;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(梅勒::类);/ /这个替换旧应用程序\梅勒定义新一,/ /旧定义是迷路了美元服务- >集(梅勒::类,NewMailer::类);};
大多数时候,这正是你想做的事。但有时,你可能想要装修旧相反(即应用装饰器模式)。在这种情况下,旧的服务应该保持在能够引用它。这个配置替换App \梅勒
一个新的,但保持旧的一个参考App \ DecoratingMailer.inner
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:~App \ DecoratingMailer:#覆盖App \梅勒服务#,但是服务和App \ DecoratingMailer.inner仍然可用装饰:App \梅勒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< !——配置/服务。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsd=“http://www.w3.org/2001/XMLSchema-instance”xsd: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\梅勒”/ ><服务id=“应用程序\ DecoratingMailer”装修=“应用程序\梅勒”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\DecoratingMailer;使用应用程序\梅勒;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(梅勒::类);美元服务- >集(DecoratingMailer::类)/ /重写应用程序\梅勒服务/ /但服务和App \ DecoratingMailer.inner仍然可用- >装修(梅勒::类);};
的装修
选项告诉容器App \ DecoratingMailer
服务取代了App \梅勒
服务。如果你使用默认的服务。yaml的配置时,装饰服务是自动注入装修服务有一个参数的构造函数type-hinted与装饰服务类。
如果你不使用自动装配或装修服务有多个构造函数参数type-hinted与装饰服务类,您必须显式地注入装饰服务(装饰的ID服务会自动改变decorating_service_id +“。”
):
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:~App \ DecoratingMailer:装饰:App \梅勒#通过旧服务作为参数参数:(“@App \ DecoratingMailer.inner”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
< !——配置/服务。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsd=“http://www.w3.org/2001/XMLSchema-instance”xsd: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\梅勒”/ ><服务id=“应用程序\ DecoratingMailer”装修=“应用程序\梅勒”><论点类型=“服务”id=“应用程序\ DecoratingMailer.inner”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\DecoratingMailer;使用应用程序\梅勒;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(梅勒::类);美元服务- >集(DecoratingMailer::类)- >装修(梅勒::类)/ /通过旧服务作为参数- >args ([ref (DecoratingMailer::类。“。”)));};
提示
装饰的可见性App \梅勒
服务新服务(别名)仍将是和原来的一样App \梅勒
可见性。
请注意
生成的内部id是基于id的装饰服务(App \ DecoratingMailer
),而不是装饰的服务(App \梅勒
这里)。你可以通过控制内部服务的名字decoration_inner_name
选择:
- YAML
- XML
- PHP
1 2 3 4 5 6
#配置/ services.yaml服务:App \ DecoratingMailer:#……decoration_inner_name:App \ DecoratingMailer.wooz参数:(“@App \ DecoratingMailer.wooz”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
< !——配置/服务。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsd=“http://www.w3.org/2001/XMLSchema-instance”xsd: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务>< !——……- - ><服务id=“应用程序\ DecoratingMailer”装修=“应用程序\梅勒”decoration-inner-name=“应用程序\ DecoratingMailer.wooz”公共=“假”><论点类型=“服务”id=“应用程序\ DecoratingMailer.wooz”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\DecoratingMailer;使用应用程序\梅勒;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(梅勒::类);美元服务- >集(DecoratingMailer::类)- >装修(梅勒::类,DecoratingMailer::类。“.wooz”)- >args ([ref (DecoratingMailer::类。“.wooz”)));};
装饰的优先级
将多个修饰符应用于服务时,您可以控制它们的顺序decoration_priority
选择。它的值是一个整数,默认0
和更高的优先级意味着修饰符将被应用。
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12
#配置/ services.yamlFoo:~栏:装饰:喷火decoration_priority:5参数:(“@Bar.inner”)记者:装饰:喷火decoration_priority:1参数:(“@Baz.inner”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
< !——配置/服务。xml - - >< ?xml version = " 1.0 " 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”><服务><服务id=“Foo”/ ><服务id=“酒吧”装修=“Foo”decoration-priority=“5”><论点类型=“服务”id=“Bar.inner”/ >< /服务><服务id=“记者”装修=“Foo”decoration-priority=“1”><论点类型=“服务”id=“Baz.inner”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(Foo::类);美元服务- >集(酒吧::类)- >装修(Foo::类,零,5)- >args (ref(酒吧::类。“。”)));美元服务- >集(巴兹::类)- >装修(Foo::类,零,1)- >args ([ref(巴兹::类。“。”)));};
生成的代码如下:
1
美元这- >服务(Foo::类]=新巴兹(新栏(新Foo ()));
控制行为当装饰服务不存在
当你装修的服务不存在,decoration_on_invalid
选项允许你选择采取的行为。
三个不同的行为是可用的:
异常
:一个ServiceNotFoundException
被告诉,装饰的依赖是失踪。(默认)忽略
:容器将删除装饰。零
:容器将装饰服务,将装饰零
。
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/ services.yamlFoo:~栏:装饰:喷火decoration_on_invalid:忽略参数:(“@Bar.inner”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< !——配置/服务。xml - - >< ?xml version = " 1.0 " 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”><服务><服务id=“Foo”/ ><服务id=“酒吧”装修=“Foo”decoration-on-invalid=“忽略”><论点类型=“服务”id=“Bar.inner”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用欧宝娱乐app下载地址\组件\DependencyInjection\ContainerInterface;返回函数(ContainerConfigurator美元配置器){美元服务=美元配置器- >服务();美元服务- >集(Foo::类);美元服务- >集(酒吧::类)- >装修(Foo::类,零,0,ContainerInterface::IGNORE_ON_INVALID_REFERENCE)- >args (ref(酒吧::类。“。”)));};
谨慎
当使用零
,你可能需要更新装饰构造函数为了装饰依赖可以为空:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
名称空间应用程序\服务;使用Acme\OptionalBundle\服务\OptionalService;类DecoratorService{私人美元装饰;公共函数__construct(? OptionalService美元装饰){美元这- >装饰=美元装饰;}公共函数tellInterestingStuff():字符串{如果(!美元这- >装饰){返回一个有趣的;}返回美元这- >装饰- >tellInterestingStuff ()。+一个有趣的;}}
请注意
有时,您可能想添加一个动态编译器通过创建服务定义。如果你想装修等服务,确保你的编译器通过注册PassConfig: TYPE_BEFORE_OPTIMIZATION
类型的装饰通过将能够找到创建的服务。