如何在 symfony2中的控制器中读取 Parameter ters.yml?

我已经在 app/config/旦参数. yml 中放入了一些自定义变量。

parameters:
api_pass: apipass
api_user: apiuser

我需要从我的控制器访问这些文件,并尝试用

$this->get('api_user');

从我的控制器文件。当我尝试这个,我得到这个错误消息:

You have requested a non-existent service "api_user".

做这件事的正确方法是什么?

174010 次浏览

Symfony 2.6及更早版本中,要获取控制器中的参数-您应该先获取容器,然后-获取所需的参数。

$this->container->getParameter('api_user');

这个 文件章节能解释。

而控制器中的 $this->get()方法将加载一个服务(医生)

Symfony 2.7和更新的版本中,要获得控制器中的参数,可以使用以下方法:

$this->getParameter('api_user');

我给你们举个例子:

参数 yml

recipients: [email1, email2, email3]

服务:

your_service_name:
class: your_namespace
arguments: ["%recipients%"]

服务类别:

protected $recipients;


public function __construct($recipients)
{
$this->recipients = $recipients;
}

你亦可使用:

$container->getParameter('api_user');

访问 http://symfony.com/doc/current/service_container/parameters.html

你可使用:

public function indexAction()
{
dump( $this->getParameter('api_user'));
}

要了解更多信息,我建议你阅读文档:

Http://symfony.com/doc/2.8/service_container/parameters.html

清洁之路-2018 + ,Symfony 3.4 +

自2017年以来,Symfony 3.3 + 3.4 有了更清洁的方式-易于安装和使用。

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

如何设置它在两个步骤?

1. 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: ..

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...))。

在 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%'

它适用于控制器和表单类。

在 Symfony 4.3.1我用这个:

服务部 Yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');

在 Symfony 5中,当 Controller 扩展 AbstractController时,您可以使用:

$projectDir = $this->getParameter('kernel.project_dir');

有关更多信息,请参见 https://symfony.com/doc/current/configuration.html#accessing-configuration-parameters