如何从服务中访问应用程序参数?

从我的控制器,我访问应用程序参数( /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% 

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

您可以像注入其他服务一样将parameter passing给服务,方法是在服务定义中指定它们。 例如,在YAML中:

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

%my_param1%等对应于一个名为my_param1的参数。 那么你的服务类构造函数可以是:

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

为什么不让你的服务直接访问容器,而不是逐个映射你需要的参数呢? 这样做,如果添加了新的参数(与您的服务相关),则不必更新映射。

要做到这一点:

对服务类进行以下更改

 use Symfony\Component\DependencyInjection\ContainerInterface; // <- Add this class MyServiceClass { private $container; // <- Add this public function __construct(ContainerInterface $container) // <- Add this { $this->container = $container; } public function doSomething() { $this->container->getParameter('param_name_1'); // <- Access your param } } 

在你的services.yml中添加@service_container作为“参数”

 services: my_service_id: class: ...\MyServiceClass arguments: ["@service_container"] // <- Add this 

作为一些问题的解决scheme,我定义了一个数组参数然后注入它。 稍后添加一个新参数只需要添加参数数组,而不需要对service_container参数或构造进行任何更改。

所以在@richsage上延伸的答案是:

parameters.yml

 parameters: array_param_name: param_name_1: "value" param_name_2: "value" 

services.yml

 services: my_service: class: My\Bundle\Service\MyService arguments: [%array_param_name%] 

然后进入课堂

 public function __construct($params) { $this->param1 = array_key_exists('param_name_1',$params) ? $params['param_name_1'] : null; // ... }