如何装修服务
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.4,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.3(当前的稳定版本)。
如何装修服务
覆盖现有的定义时,原始服务丢失:
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:AppBundle \梅勒:~#这替换旧AppBundle \梅勒与新的定义,#老定义是迷路了AppBundle \梅勒:类:AppBundle \ 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=“AppBundle \梅勒”/ >< !——这替换旧AppBundle \梅勒与新的定义,旧的定义是失去- - ><服务id=“AppBundle \梅勒”类=“AppBundle \ NewMailer”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8 9
/ /配置/ services.php使用AppBundle\梅勒;使用AppBundle\NewMailer;美元容器- >注册(梅勒::类);/ /这个替换旧AppBundle \梅勒定义新一,/ /旧定义是迷路了美元容器- >注册(梅勒::类,NewMailer::类);
大多数时候,这正是你想做的事。但有时,你可能想要装修旧相反(即应用装饰器模式)。在这种情况下,旧的服务应该保持在能够引用它。这个配置替换App \梅勒
一个新的,但保持旧的一个参考App \ DecoratingMailer.inner
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ services.yaml服务:AppBundle \梅勒:~AppBundle \ DecoratingMailer:#覆盖AppBundle \梅勒服务#但AppBundle \ DecoratingMailer.inner服务仍然可用装饰:AppBundle \梅勒#通过旧服务作为参数参数:(“@AppBundle \ DecoratingMailer.inner”)#私人的,因为通常不需要获取AppBundle \ DecoratingMailer直接公众:假
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
< !——配置/服务。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=“AppBundle \梅勒”/ >< !——覆盖AppBundle \梅勒服务,但服务AppBundle \ DecoratingMailer仍然可用。内部私有的,因为通常不需要获取AppBundle \ DecoratingMailer直接- - ><服务id=“AppBundle \ DecoratingMailer”装修=“AppBundle \梅勒”公共=“假”>< !——通过旧的服务作为一个参数- - ><论点类型=“服务”id=“AppBundle \ DecoratingMailer.inner”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /配置/ services.php使用AppBundle\DecoratingMailer;使用AppBundle\梅勒;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元容器- >注册(梅勒::类);/ /重写AppBundle \梅勒服务/ /但AppBundle \ DecoratingMailer.inner服务仍然可用美元容器- >注册(DecoratingMailer::类)- >setDecoratedService(梅勒::类)/ /通过旧服务作为参数- >addArgument (新引用(DecoratingMailer::类。“。”))/ /私有的,因为通常不需要获取AppBundle \ DecoratingMailer直接- >setPublic (假);
的装修
选项告诉容器AppBundle \ DecoratingMailer
服务取代了AppBundle \梅勒
服务。旧的AppBundle \梅勒
服务是重命名为AppBundle \ DecoratingMailer.inner
所以你可以将它注入你的新服务。
提示
的可见性(公共)装饰AppBundle \梅勒
服务新服务(别名)仍将是和原来的一样AppBundle \梅勒
可见性。
请注意
生成的内部id是基于id的装饰服务(AppBundle \ DecoratingMailer
),而不是装饰的服务(AppBundle \梅勒
这里)。你可以通过控制内部服务的名字decoration_inner_name
选择:
1 2 3 4 5 6
#配置/ services.yaml服务:AppBundle \ DecoratingMailer:#……decoration_inner_name:AppBundle \ DecoratingMailer.wooz参数:(“@AppBundle \ 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=“AppBundle \ DecoratingMailer”装修=“AppBundle \梅勒”decoration-inner-name=“AppBundle \ DecoratingMailer.wooz”公共=“假”><论点类型=“服务”id=“AppBundle \ DecoratingMailer.wooz”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9
/ /配置/ services.php使用AppBundle\DecoratingMailer;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元容器- >注册(DecoratingMailer::类)- >DecoratingMailer setDecoratedService (AppBundle \梅勒::类。“.wooz”)- >addArgument (新引用(DecoratingMailer::类。“.wooz”))/ /……;
装饰的优先级
将多个修饰符应用于服务时,您可以控制它们的顺序decoration_priority
选择。它的值是一个整数,默认0
和更高的优先级意味着修饰符将被应用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/ 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
/ /配置/ services.php使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元容器- >注册(Foo::类)美元容器- >注册(酒吧::类)- >addArgument (新引用(酒吧::类。“。”))- >setPublic (假)- >setDecoratedService (Foo::类,零,5);美元容器- >注册(巴兹::类)- >addArgument (新引用(巴兹::类。“。”))- >setPublic (假)- >setDecoratedService (Foo::类,零,1);
生成的代码如下:
1
美元这- >服务(Foo::类]=新巴兹(新栏(新Foo ()));
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。