如何装修服务
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.2,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
如何装修服务
当覆盖现有的定义(例如,当应用装饰器模式),原始服务丢失:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
服务:app.mailer:类:AppBundle \梅勒#这个替换旧app.mailer定义新一,#老定义是迷路了app.mailer:类:AppBundle \ DecoratingMailer
1 2 3 4 5 6 7 8 9 10 11 12 13
< ?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=“app.mailer”类=“AppBundle \梅勒”/ >< !——这替换旧app.mailer定义新的,旧的定义是失去- - ><服务id=“app.mailer”类=“AppBundle \ DecoratingMailer”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8
使用AppBundle\梅勒;使用AppBundle\DecoratingMailer;美元容器- >注册(“app.mailer”,梅勒::类);/ /这个替换旧app.mailer定义新一,/ /旧定义是迷路了美元容器- >注册(“app.mailer”,DecoratingMailer::类);
大多数时候,这正是你想做的事。但有时,你可能想要装修旧的。在这种情况下,旧的服务应该保持在能够引用它。这个配置替换app.mailer
一个新的,但保持旧的一个参考app.decorating_mailer.inner
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
服务:#……app.decorating_mailer:类:AppBundle \ DecoratingMailer装饰:app.mailer参数:(“@app.decorating_mailer.inner”)公众:假
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< ?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=“app.decorating_mailer”类=“AppBundle \ DecoratingMailer”装修=“app.mailer”公共=“假”><论点类型=“服务”id=“app.decorating_mailer.inner”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9
使用AppBundle\DecoratingMailer;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;/ /……美元容器- >注册(“app.decorating_mailer”,DecoratingMailer::类)- >setDecoratedService (“app.mailer”)- >addArgument (新引用(“app.decorating_mailer.inner”))- >setPublic (假);
这是这是怎么回事:装修
选项告诉容器app.decorating_mailer
服务取代了app.mailer
服务。按照惯例,旧的app.mailer
服务是重命名为app.decorating_mailer.inner
,所以你可以将它注入你的新服务。
提示
大多数时候,装饰应该宣布私人,你不需要检索它app.decorating_mailer
从容器中。
装饰的可见性app.mailer
服务新服务(别名)仍将是和原来的一样app.mailer
可见性。
请注意
生成的内部id是基于id的装饰服务(app.decorating_mailer
),而不是装饰的服务(app.mailer
这里)。这是强制性的让几个修饰符相同的服务(他们需要不同的内在生成id)。
你可以改变内在的服务名称,如果你想使用decoration_inner_name
选择:
- YAML
- XML
- PHP
1 2 3 4 5
服务:app.decorating_mailer:#……decoration_inner_name:app.decorating_mailer.wooz参数:(“@app.decorating_mailer.wooz”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
< ?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=“app.decorating_mailer”类=“AppBundle \ DecoratingMailer”装修=“app.mailer”decoration-inner-name=“app.decorating_mailer.wooz”公共=“假”><论点类型=“服务”id=“app.decorating_mailer.wooz”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8
使用AppBundle\DecoratingMailer;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元容器- >注册(“app.decorating_mailer”,DecoratingMailer::类)- >setDecoratedService (“app.mailer”,“app.decorating_mailer.wooz”)- >addArgument (新引用(“app.decorating_mailer.wooz”))/ /……;
装饰的优先级
如果你想申请多个装饰服务,您可以控制他们的订单通过配置的优先级装饰,这可以是任意整数(先用更高的优先级将被应用修饰符)。
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
foo:类:喷火栏:类:酒吧公众:假装饰:喷火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
< ?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”类=“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
使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;美元容器- >注册(“foo”,“Foo”)美元容器- >注册(“酒吧”,“酒吧”)- >addArgument (新引用(“bar.inner”))- >setPublic (假)- >setDecoratedService (“foo”,零,5);美元容器- >注册(“记者”,“记者”)- >addArgument (新引用(“baz.inner”))- >setPublic (假)- >setDecoratedService (“foo”,零,1);
生成的代码如下:
1
美元这- >服务(“foo”]=新巴兹(新栏(新Foo ())));
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。