如何基于复杂表达式注入值

如何基于复杂表达式注入值

服务容器还支持“表达式”,允许您将非常特定的值注入服务。

例如,假设您有一个服务(这里未显示),调用app \ mail \ moderConfiguration,有一个getmailermethod()关于它的方法。这返回一个字符串 - 就像发送邮件基于一些配置。

假设您希望将此方法的结果作为另一个服务的构造函数参数:app \ mailer.。这样做的一种方法是表达式:

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11
    #配置/服务.YAML服务#...app \ mail \ moderConfigurationapp \ mailer.#使用YAML文件中的参数表达式时,需要“@ =”前缀争论['@ =服务(“app \\ mail \\ moderconfiguration”)。getmailermethod()']#使用双引号字符串时,反斜杠需要逃脱两次(请参阅https://yaml.org/spec/1.2/spec.html#id2787109)#参数:[“@ =服务('app \\\\ mail \\\\\ moberconfiguration')。getmailermethod()”]
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><! -  ...  - ><服务ID =“app \ mail \ moderconfiguration”> <服务ID =“app \ mailer”><争论类型=“表达”>服务('app \\ mail \\ moderconfiguration')。getmailermethod()
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;app \ mail \ moderConfiguration;app \ mailer.;返回功能containerconfigurator$ Configurator.{// ......$服务- >moderConfiguration.::班级);$服务- >邮箱::班级- >args.([expr.“服务('应用程序\\邮件\\ModerConfiguration')。getmailermethod()“)]);};

要了解有关表达语言语法的更多信息,请参阅表达式语法

在此上下文中,您可以访问2个功能:

服务
返回给定服务(参见上面的示例)。
范围
返回特定的参数值(语法就像服务)。

您还可以访问欧宝娱乐app下载地址symfony \ component \ decigendenceIngress \容器通过A.容器多变的。这是另一个例子:

  • yaml.
    1 2 3 4 5
    #配置/服务.YAML服务app \ mailer.#使用YAML文件中的参数表达式时,需要“@ =”前缀争论[“@ = container.hasparameter('some_param')参数('some_param')'默认值'”]
  • XML.
    1 2 3 4 5 6 7 8 9 10 11 12 13
    <! -  config / services.xml  - ><?XML Version =“1.0”编码=“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.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd“><服务><服务ID =“app \ mailer”><争论类型=“表达”>container.hasparameter('some_param')?参数('some_param'):'default_value'
  • PHP.
    1 2 3 4 5 6 7 8 9 10 11
    // config / services.php命名空间欧宝娱乐app下载地址Symfony \ Component \ DependencyIngreation \ Loader \ Configurator;app \ mailer.;返回功能containerconfigurator$ Configurator.{$服务=$ Configurator.- >服务();$服务- >邮箱::班级- >args.([expr.“container.hasparameter('some_param')?参数('some_param'):'default_value'”)]);};

表达式可以使用争论特性,作为争论配置器作为论点呼叫(方法调用)。

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。