Как мне прочитать из settings.yml в контроллере в symfony2?

128

В моем приложении /config/parameters.yml добавлена ​​пара пользовательских переменных.

parameters:
    api_pass: apipass
    api_user: apiuser

Мне нужно получить доступ к ним из моего контроллера и попытались получить их с помощью

$this->get('api_user');

из моего файла контроллера. Когда я попробую это, я получаю это сообщение об ошибке:

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

Каков правильный способ сделать это?

Теги:
symfony-2.3

6 ответов

268
Лучший ответ

В Symfony 2.6 и более ранних версиях, чтобы получить параметр в контроллере - сначала вы должны получить контейнер, а затем - необходимый параметр.

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

Эта глава объясняет это.

В то время как метод $this->get() в контроллере будет загружать службу (doc)

В Symfony 2.7 и более новых версиях, чтобы получить параметр в контроллере, вы можете использовать следующее:

$this->getParameter('api_user');
  • 3
    Обратите внимание, что метод get в контроллере также использует контейнер, но он может получать сервисы только из контейнера, а не из параметров. Вам нужен getParameter чтобы получить параметры.
  • 0
    Когда я пытаюсь $this->getContainer()->getParameter('api_user'); Я получаю фатальную ошибку: вызов неопределенного метода ..Longpath .. \ Controller :: getContainer ().
Показать ещё 4 комментария
17

Чистый Путь

Начиная с 2017 года и Symfony 3.3 + 3.4 существует гораздо более понятный способ - простой в настройке и использовании.

Вместо использования контейнера и анти-шаблона локатора службы/параметра вы можете передать параметры в класс через его конструктор. Не волнуйтесь, это не трудоемкая работа, а скорее настройка "один раз и забыть".

Как настроить это в 2 шага?

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 Controller Чистым способом.

(Он проверен, и я обновляю его для новой основной версии Symfony (5, 6...)).

9

Присылаю вам пример с swiftmailer:

parameters.yml

recipients: [email1, email2, email3]

услуги:

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

класс службы:

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}
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%'

Это работает для меня как в контроллере, так и в классах форм. Более подробную информацию можно найти в блоге Symfony.

  • 1
    Передача целых параметров мешка аналогична прохождению целого контейнера. Это имеет смысл только в том случае, если «какой-то конкретной службе требуется множество параметров контейнера» (цитата из поста)
  • 0
    Итак, вы имеете в виду передачу всего параметра причиной проблемы в производительности?
Показать ещё 2 комментария
0

Вы можете использовать:

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

Для получения дополнительной информации я рекомендую вам прочитать документ:

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

-1

Вы также можете использовать:

$container->getParameter('api_user');

Посетите http://symfony.com/doc/current/service_container/parameters.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню