153

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

parameters:
    api_pass: apipass
    api_user: apiuser

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

$this->get('api_user');

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

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

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

4

8 回答 8

302

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

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

文档章节对此进行了解释。

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

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

$this->getParameter('api_user');
于 2012-12-16T12:26:29.823 回答
28

清洁方式 - 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 将其自动化

阅读更多

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

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

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

于 2018-01-21T20:51:34.067 回答
11

我给你发了一个 swiftmailer 的例子:

参数.yml

recipients: [email1, email2, email3]

服务:

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

服务等级:

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}
于 2016-03-31T08:28:45.923 回答
10

在 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 博客中找到

于 2018-09-05T12:44:02.047 回答
2

您可以使用:

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

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

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

于 2017-03-09T10:13:33.997 回答
1

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

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

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

于 2021-04-15T14:15:59.953 回答
0

在 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');
于 2019-07-03T09:34:09.680 回答
-1

您还可以使用:

$container->getParameter('api_user');

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

于 2016-12-08T12:45:45.597 回答