跳到內容

如何根據複雜運算式注入數值

編輯此頁

服務容器也支援「運算式」,讓您可以將非常特定的數值注入到服務中。

例如,假設您有一個名為 App\Mail\MailerConfiguration 的服務(此處未顯示),它上面有一個 getMailerMethod() 方法。這會根據某些組態傳回一個字串,例如 sendmail

假設您想要將此方法的結果作為建構子引數傳遞給另一個服務:App\Mailer。一種方法是使用運算式

1
2
3
4
5
6
7
8
9
10
11
# config/services.yaml
services:
    # ...

    App\Mail\MailerConfiguration: ~

    App\Mailer:
        # the '@=' prefix is required when using expressions for arguments in YAML files
        arguments: ['@=service("App\\Mail\\MailerConfiguration").getMailerMethod()']
        # when using double-quoted strings, the backslash needs to be escaped twice (see https://yaml.org/spec/1.2/spec.html#id2787109)
        # arguments: ["@=service('App\\\\Mail\\\\MailerConfiguration').getMailerMethod()"]

深入瞭解運算式語言語法

在此上下文中,您可以存取 3 個函式

service
傳回給定的服務(請參閱上面的範例)。
parameter
傳回特定的參數值(語法類似 service)。
env
傳回環境變數的值。

您也可以透過 container 變數存取 容器。以下是另一個範例

1
2
3
4
5
# config/services.yaml
services:
    App\Mailer:
        # the '@=' prefix is required when using expressions for arguments in YAML files
        arguments: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]

運算式可以用於 argumentsproperties、作為 configurator 的引數、calls (方法呼叫) 的引數,以及 factories (服務工廠)。

這份作品,包括程式碼範例,以 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本