我在app / config / parameters.yml中放了几个自定义变量。
parameters:
api_pass: apipass
api_user: apiuser
我需要从我的控制器访问这些,并尝试使用
获取它们$this->get('api_user');
来自我的控制器文件。当我尝试这个时,我收到此错误消息:
You have requested a non-existent service "api_user".
这样做的正确方法是什么?
答案 0 :(得分:284)
在 Symfony 2.6及更早版本中,要获取控制器中的参数 - 您应首先获取容器,然后获取所需参数。
$this->container->getParameter('api_user');
这documentation chapter解释了它。
虽然控制器中的$this->get()
方法将加载服务(doc)
在 Symfony 2.7及更新版本中,要获取控制器中的参数,您可以使用以下内容:
$this->getParameter('api_user');
答案 1 :(得分:17)
自2017年起和Symfony 3.3 + 3.4 有更清晰的方式 - 易于设置和使用。
您可以通过它的构造函数 将参数传递给类,而不是使用容器和服务/参数定位器反模式。别担心,这不是时间要求很高的工作,而是设置一次&忘了方法。
如何分两步设置?
app/config/services.yml
# 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: ..
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"
}
}
如果您使用旧方法,可以automate it with Rector。
这称为构造函数注入服务定位器方法。
要详细了解此信息,请查看我的帖子How to Get Parameter in Symfony Controller the Clean Way。
(经过测试,我保持更新为新的Symfony主要版本(5,6 ...))。
答案 2 :(得分:9)
我给你发了一个swiftmailer的例子:
recipients: [email1, email2, email3]
your_service_name:
class: your_namespace
arguments: ["%recipients%"]
protected $recipients;
public function __construct($recipients)
{
$this->recipients = $recipients;
}
答案 3 :(得分:1)
在Symfony 4中,您可以使用ParameterBagInterface
:
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');
// ...
}
}
和app/config/services.yaml
中的
parameters:
locale: 'en'
dir: '%kernel.project_dir%'
它对我来说都适用于控制器类和表单类。 More details can be found in the Symfony blog。
答案 4 :(得分:0)
您可以使用:
public function indexAction()
{
dump( $this->getParameter('api_user'));
}
有关详细信息,我建议您阅读文档:
http://symfony.com/doc/2.8/service_container/parameters.html
答案 5 :(得分:0)
在Symfony 4.3.1中,我使用以下代码:
services.yaml
HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'
FrontController.php
$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');
答案 6 :(得分:0)
在 Symfony 5 中,当您的控制器扩展 AbstractController
时,您可以使用:
$projectDir = $this->getParameter('kernel.project_dir');
查看https://symfony.com/doc/current/configuration.html#accessing-configuration-parameters了解更多信息
答案 7 :(得分:-1)
您也可以使用:
$container->getParameter('api_user');
访问http://symfony.com/doc/current/service_container/parameters.html