如何布置服务

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何布置服务

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

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:#这将用新的App\Mailer定义替换旧的App\Mailer定义#旧定义丢失App \梅勒:类:App \ NewMailer

大多数时候,这正是你想要做的。但有时,你可能想要装饰旧的(即应用装饰器模式).在这种情况下,应该保留旧服务,以便能够在新服务中引用它。这个配置替换了App \梅勒用一个新的,但把旧的作为参考

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:App \ DecoratingMailer:#覆盖App\Mailer服务#但该服务仍然可用为".inner"装饰:App \梅勒

装修选项告诉容器App \ DecoratingMailer服务替换App \梅勒服务。如果你在用默认的服务。yaml的配置,当装饰服务的构造函数使用装饰服务类暗示一个参数类型时,就会自动注入装饰服务。

如果你没有使用自动装配,或者装饰服务有多个构造函数参数类型暗示了装饰服务类,你必须显式地注入装饰服务(装饰服务的ID会自动更改为“。”):

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:App \梅勒:App \ DecoratingMailer:装饰:App \梅勒#将旧服务作为参数传递参数:(“@.inner”)

5.1

特殊的值在Symfony 5.1中引入。ob娱乐下载在以前的版本中,您需要使用:Decorating_service_id + '.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
12 3 4 5 6 7 8 9 10 11 12
#配置/ services.yamlFoo:栏:装饰:喷火decoration_priority:5参数:(“@.inner”)记者:装饰:喷火decoration_priority:1参数:(“@.inner”)

生成的代码如下所示:

1
->服务(Foo::类]=巴兹(栏(Foo ()));

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

当您装饰一个不存在的服务时,decoration_on_invalid选项允许你选择要采取的行为。

有三种不同的行为:

  • 异常:一个ServiceNotFoundException将抛出,告诉该装饰器的依赖项丢失。(默认)
  • 忽略:容器将移除装饰器。
  • :容器将保持decorator服务,并将被装饰的服务设置为
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yamlFoo:栏:装饰:喷火decoration_on_invalid:忽略参数:(“@.inner”)

谨慎

当使用,你可能需要更新装饰器的构造函数,以使装饰依赖为空:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /服务/ DecoratorService.php名称空间应用程序服务使用AcmeOptionalBundle服务OptionalServiceDecoratorService私人装饰公共函数__construct(?OptionalService装饰->装饰=装饰;}公共函数tellInterestingStuff()字符串如果(!->装饰){返回“只有一件有趣的事”;}返回->装饰->tellInterestingStuff()。“+一个更有趣的事情”;}}

请注意

有时,您可能希望添加一个编译器通道,以便动态地创建服务定义。如果您想装饰这样一个服务,请确保您的编译器通道已注册PassConfig: TYPE_BEFORE_OPTIMIZATION键入,以便装饰通道能够找到创建的服务。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。