如何从 symfony2 的控制器中读取 parameters.yml?

Posted

技术标签:

【中文标题】如何从 symfony2 的控制器中读取 parameters.yml?【英文标题】:How do I read from parameters.yml in a controller in symfony2? 【发布时间】:2012-12-03 18:53:33 【问题描述】:

我在 app/config/parameters.yml 中放置了几个自定义变量。

parameters:
    api_pass: apipass
    api_user: apiuser

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

$this->get('api_user');

从我的控制器文件中。当我尝试这个时,我收到以下错误消息:

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

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

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

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

documentation chapter 解释了它。

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

Symfony 2.7 和更新版本中,要在控制器中获取参数,您可以使用以下命令:

$this->getParameter('api_user');

【讨论】:

请注意,控制器中的get方法也使用了容器,但它只能从容器中获取服务,不能获取参数。获取参数需要getParameter 当我尝试$this->getContainer()->getParameter('api_user'); 时出现致命错误:调用未定义的方法..Longpath..\Controller::getContainer()。 @Bohr 抱歉,Symfony2 的不同版本。我已经编辑了我的答案 - 现在检查;) 文档的 URL 现在是 symfony.com/doc/2.7/components/dependency_injection/… Symfony 2.7 和更新版本:$this->hasParameter() 还没有工作。【参考方案2】:

清洁方式 - 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"
    

即时升级就绪!

如果您使用较旧的方法,您可以automate it with Rector。

了解更多

这称为构造函数注入服务定位器方法。

要了解更多信息,请查看我的帖子How to Get Parameter in Symfony Controller the Clean Way。

(它已经过测试,我会为新的 Symfony 主要版本(5、6...)进行更新。

【讨论】:

关于这个话题的新简约方式:tomasvotruba.cz/blog/2018/11/05/…【参考方案3】:

我给你发一个 swiftmailer 的例子:

parameters.yml

recipients: [email1, email2, email3]

服务:

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

服务的类别:

protected $recipients;

public function __construct($recipients)

    $this->recipients = $recipients;

【讨论】:

【参考方案4】:

在 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.

【讨论】:

传递整个参数包就像传递整个容器。仅在“如果某些特定服务需要大量容器参数时”才有意义(引自帖子) 那么,您的意思是传递整个参数会导致性能问题吗? 这是原因之一,但主要是为了可读性。如果我看到参数名称$meetupApiKey,我知道会比$parameterBag 更好地期待什么【参考方案5】:

你可以使用:

public function indexAction()

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

有关更多信息,我建议您阅读文档:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

在 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');

【讨论】:

在 4.8 中不起作用。你确定有一天它会奏效吗? 我真的忘记了这一点,但是它可能有效,因为我只发布了经过测试的东西! 对不起,阿哈拉夫。我不知道,但没有在我的控制器中工作。在您的控制器内部,您可以直接调用 getParameter,无需 DI。即:$this-&gt;getParameter('foo')。这就是我在 SF 4.8 中所做的工作。【参考方案8】:

你也可以使用:

$container->getParameter('api_user');

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

【讨论】:

以上是关于如何从 symfony2 的控制器中读取 parameters.yml?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 中的 JWT 令牌

Symfony2.8。如何从发布请求中获取数据

如何从 symfony2 中删除实体

Symfony2/Doctrine:如何从实体类中持久化一个实体?

如何在 Symfony2 中获取控制器的所有路由列表?

如何在 symfony2 中进行编辑功能