如何从服务中访问应用程序参数?
从我的控制器,我访问应用程序参数( /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; // ... }