如何装修服务

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何装修服务

覆盖现有的定义时,原始服务丢失:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:~#这替换旧应用程序\梅勒与新的定义,#老定义是迷路了App \梅勒:类:App \ 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 \梅勒

装修选项告诉容器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”)

提示

装饰的可见性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”)

装饰的优先级

将多个修饰符应用于服务时,您可以控制它们的顺序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
美元- >服务(Foo::类]=巴兹(栏(Foo ()));

控制行为当装饰服务不存在

4.4

decoration_on_invalid选择已经在Symfony 4.4中引入的。ob娱乐下载在以前的版本中,aServiceNotFoundException总是抛出。

当你装修的服务不存在,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 16 17 18 19 20 21日22日23日
/ / src /服务/ DecoratorService.php名称空间应用程序\服务;使用Acme\OptionalBundle\服务\OptionalService;DecoratorService{私人美元装饰;公共函数__construct(? OptionalService美元装饰){美元- >装饰=美元装饰;}公共函数tellInterestingStuff():字符串{如果(!美元- >装饰){返回一个有趣的;}返回美元- >装饰- >tellInterestingStuff ()。+一个有趣的;}}

请注意

有时,您可能想添加一个动态编译器通过创建服务定义。如果你想装修等服务,确保你的编译器通过注册PassConfig: TYPE_BEFORE_OPTIMIZATION类型的装饰通过将能够找到创建的服务。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。