从我的控制器,我访问应用程序参数(那些/app/config)
$this->container->getParameter('my_param')
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从服务访问它(我想我的服务类不应该扩展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%
Run Code Online (Sandbox Code Playgroud)
或类似的东西?我应该如何从服务访问我的应用程序参数?
这个问题看起来是一样的,但是我实际上回答了它(来自控制器的参数),我说的是从服务访问.
ric*_*age 113
您可以通过在服务定义中指定参数,以与注入其他服务相同的方式将参数传递给服务.例如,在YAML中:
services:
my_service:
class: My\Bundle\Service\MyService
arguments: [%my_param1%, %my_param2%]
Run Code Online (Sandbox Code Playgroud)
其中%my_param1%etc对应于一个名为的参数my_param1.那么你的服务类构造函数可以是:
public function __construct($myParam1, $myParam2)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*uba 25
自2017年和Symfony 3.4以来,有更清洁的方式 - 易于设置和使用.
您可以通过它的构造函数将参数传递给类,而不是使用容器和服务/参数定位器反模式.别担心,这不是时间要求很高的工作,而是设置一次忘记方法.
如何分两步设置?
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: ..
Run Code Online (Sandbox Code Playgroud)
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"
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用旧方法,您可以使用Rector自动化它.
这称为服务定位器方法的构造函数注入.
要阅读更多相关信息,请查看我的文章如何在Symfony控制器中以干净的方式获取参数.
(经过测试,我保持更新为新的Symfony主要版本(5,6 ...)).
Ham*_* L. 19
为什么不允许您的服务直接访问容器,而不是逐个映射您需要的参数?这样做,如果添加了新参数(与您的服务相关),则无需更新映射.
为此:
对服务类进行以下更改
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
}
}
Run Code Online (Sandbox Code Playgroud)
在services.yml中将@service_container添加为"arguments"
services:
my_service_id:
class: ...\MyServiceClass
arguments: ["@service_container"] // <- Add this
Run Code Online (Sandbox Code Playgroud)
小智 6
作为上述一些问题的解决方案,我定义了一个数组参数然后注入它.稍后添加新参数只需要添加参数数组,而无需对service_container参数或构造进行任何更改.
所以扩展@richsage答案:
parameters.yml
parameters:
array_param_name:
param_name_1: "value"
param_name_2: "value"
Run Code Online (Sandbox Code Playgroud)
services.yml
services:
my_service:
class: My\Bundle\Service\MyService
arguments: [%array_param_name%]
Run Code Online (Sandbox Code Playgroud)
然后在课堂内访问
public function __construct($params)
{
$this->param1 = array_key_exists('param_name_1',$params)
? $params['param_name_1'] : null;
// ...
}
Run Code Online (Sandbox Code Playgroud)
随着Symfony的4.1的解决方案是非常简单的。
这是原始帖子的片段:
// src/Service/MessageGenerator.php
// ...
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class MessageGenerator
{
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function someMethod()
{
$parameterValue = $this->params->get('parameter_name');
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
原文链接:https : //symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service
从symfony 4.1开始,有一种非常干净的新方法可以实现它
<?php
// src/Service/MessageGeneratorService.php
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class MessageGeneratorService
{
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function someMethod()
{
$parameterValue = $this->params->get('parameter_name');
...
}
}
Run Code Online (Sandbox Code Playgroud)
来源:https : //symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service。
| 归档时间: |
|
| 查看次数: |
59367 次 |
| 最近记录: |