如何从服务访问应用程序参数?清洁之路 2018阅读更多

2022-08-30 07:53:55

从我的控制器中,我访问应用程序参数(位于 )/app/config

$this->container->getParameter('my_param')

但是我不知道如何从服务访问它(我想我的服务类不应该扩展)。Symfony\Bundle\FrameworkBundle\Controller\Controller

我应该将所需的参数映射到我的服务注册中,如下所示:

#src/Me/MyBundle/Service/my_service/service.yml
parameters:
    my_param1: %my_param1%
    my_param2: %my_param2%
    my_param3: %my_param3%

或类似的东西?如何从服务访问应用程序参数?


这个问题看起来是一样的,但我的答案实际上是(来自控制器的参数),我说的是从服务访问。


答案 1

您可以通过在服务定义中指定参数,以与注入其他服务相同的方式向服务传递参数。例如,在 YAML 中:

services:
    my_service:
        class:  My\Bundle\Service\MyService
        arguments: [%my_param1%, %my_param2%]

其中,etc 对应于名为 的参数。然后,您的服务类构造函数可以是:%my_param1%my_param1

public function __construct($myParam1, $myParam2)
{
    // ...
}

答案 2

清洁之路 2018

自2018年和Symfony 3.4以来,有更干净的方式 - 易于设置和使用。

您可以使用容器和服务/参数定位器反模式,而是可以通过它的构造函数将参数传递给类。别担心,这不是耗时的工作,而是设置一次并忘记方法。

如何通过2个步骤进行设置?

1.config.yml

# config.yml
parameters:
    api_pass: 'secret_password'
    api_user: 'my_name'

services:
    _defaults:
        autowire: true
        bind:
            $apiPass: '%api_pass%'
            $apiUser: '%api_user%'

    App\:
        resource: ..

2. 任何Controller

<?php declare(strict_types=1);

final class ApiController extends SymfonyController
{
    /**
     * @var string 
     */
    private $apiPass;

    /**
     * @var string
     */
    private $apiUser;

    public function __construct(string $apiPass, string $apiUser)
    {
        $this->apiPass = $apiPass;
        $this->apiUser = $apiUser;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPass); // "secret_password"
        var_dump($this->apiUser); // "my_name"
    }
}

即时升级准备就绪!

如果您使用较旧的方法,则可以使用Rector自动执行

阅读更多

这称为基于服务定位器的构造函数注入方法。

要了解有关此内容的更多信息,请查看我的帖子 如何在Symfony控制器中获取参数 干净的方式

(它经过测试,我为新的Symfony主要版本(5,6...)保持更新)。


推荐