Как мне получить параметр среды в контроллере в Symfony 3.4?

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

В app\config\.env у меня определен ключ API, например:

GOOGLE_DEVELOPER_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

В app\config\services.yml у меня есть:

parameters:
    google.developer.key: "%env(GOOGLE_DEVELOPER_KEY)%"

В одном из моих контроллеров я хочу передать этот параметр объекту следующим образом:

    $client = new \Google_Client();
    $client->setDeveloperKey($this->getParameter('google.developer.key'));

На мой взгляд, эта установка выглядит нормально, но когда я пытаюсь ее запустить, я получаю EnvNotFoundException со следующим сообщением:

Environment variable not found: "GOOGLE_DEVELOPER_KEY".

Когда я вставляю ключ напрямую в app\config\services.yml, он работает нормально:

parameters:
    google.developer.key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

(Но я хочу не этого по разным причинам.)

Я очистил кеш dev, перезапустил веб-сервер, прочитал соответствующую документацию Symfony (я думаю), но безуспешно. Думаю, я пропускаю шаг, но не могу понять, что это было бы. Любые подсказки будут оценены.

Ваш код работает на меня

Smaïne 14.05.2018 22:27

Странный. Спасибо, @ Smaïne.

ACJ 14.05.2018 22:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
2
9 114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Symphony v3.4 документация по переменным среды рекомендует использовать ваш веб-сервер для настройки переменных среды.

Я не мог проверить это, так как моя установка - это Symfony v4, и она использует файл /.env для настройки переменных среды.

Надеюсь, это каким-то образом поможет.

Для производства - да, но для разработки подойдет файл .env.

Francesco Abeni 14.05.2018 20:34

Для производства это мой план, но для dev это непрактично по нескольким причинам. Спасибо!

ACJ 14.05.2018 22:31
Ответ принят как подходящий

Symfony 3.4 не загружает файл .env автоматически. Вы должны изменить ваш app_dev.php, чтобы загрузить файл:

use Symfony\Component\Dotenv\Dotenv;
...
$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/../app/config/.env');

Думаю, в этом есть смысл. Что еще более важно: это полностью работает. Спасибо!

ACJ 14.05.2018 22:42

Я отредактировал свой ответ, чтобы явно указать часть composer require symfony/dotenv.

Francesco Abeni 15.05.2018 08:52

Спасибо @Francesco Abeni. Однако мне не требовался этот шаг. Разве он не поставляется с Symfony 3.4?

ACJ 15.05.2018 15:03

@ACJ, ты прав. Этот шаг не нужен в Symfony 3.4.

Francesco Abeni 15.05.2018 15:19

На самом деле это неправильно! Здесь вы загружаете определенный файл .env, но это может быть НЕ тот файл .env или даже переменные среды, которые использует ваше приложение Symfony! (подумайте о переменных, поступающих из Docker, .env.XXX.local, parameters.yml и т. д.)

Sliq 24.06.2019 15:19

@Sliq ваш комментарий полезен, но я не думаю, что мой ответ неправильный. Он отвечает на исходный вопрос: «Почему мой файл .env не загружается?». Конечно, вы можете получить переменные окружения из других мест, но это другой вопрос, ИМХО. Спасибо за ваше предложение!

Francesco Abeni 25.06.2019 11:17

Зачем инициализировать Google_Client в вашем контроллере, а не использовать контейнер службы?

См .: https://symfony.com/doc/3.4/service_container.html

Вы можете передать этот ключ разработчика в массиве с ключом developer_key в конструкции.

Проблема не в этом, но спасибо за ваше предложение.

ACJ 14.05.2018 23:03

Другие вопросы по теме