Symfony 4 - переменные .env недоступны - PullRequest
0 голосов
/ 08 ноября 2019

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

В корне моего проекта есть файл .env по умолчанию, заполненный обычным APP_ENV, APP_SECRET и DATABASE_URL;это все здорово. Тем не менее, добавление любой пользовательской переменной на самом деле, похоже, не делает ничего! Если я, например, добавлю ANOTHER_VAR=hello_world, а затем запусту bin/console debug:container --env-vars, он только выведет на экран переменные APP_SECRET и DATABASE_URL. Однако, если я запускаю bin/console about, он показывает мне все переменные внутри .env.

Я думал, что это может быть проблема с кэшированной переменной, но если я изменю значение APP_SECRET и запущу консольКоманда снова выводит измененное значение, но все еще не мои пользовательские переменные.

Я подозреваю , что env vars недоступны для контейнера по умолчанию, но мне это не кажется правильным(плюс это кажется несколько противоречащим тому, что сами документы Symfony говорят).

Что мне нужно сделать, чтобы зарегистрировать эти переменные, чтобы я мог получить к ним доступ, например, из контроллера?

1 Ответ

0 голосов
/ 08 ноября 2019

Как типично для меня, я наткнулся на ответ в течение получаса после разочарования и просьбы о помощи.

Вопреки тому, как читается документация , просто добавив переменную вфайл .env не делает его доступным внутри контейнера (и поэтому не отображается в списке при запуске bin/console debug:container --env-vars и недоступен внутри контроллера с использованием $this->getParameter('env(VAR)')). И если подумать об этом сейчас, то это имеет смысл, потому что вы не хотите, чтобы все ваших защищенных переменных были доступны для всего, что запускается из Контейнера.

Для доступа к env var высначала нужно его параметризовать, и таким образом вы также можете ограничить доступ к нему. Любые переменные env, которые вы хотите сделать доступными для всех ваших служб, вы можете установить в файле config/services.yaml следующим образом (при условии, что включена автопроводка):

parameters:
   variable_a: '%env(VAR_A)%'

Если вы предпочитаете ограничить переменную env тольконесколько сервисов, затем вы можете внедрить его в ваш сервис в качестве аргумента в config/services.yaml, например, так:

services:
  App\Service\Foo:
    arguments:
      $bar: '%env(BAZ)%'

С помощью параметра, настроенного, как указано выше, я теперь могу получить доступ к этому env var внутри моегоКонтроллер с $this->getParameter('variable_a'). Выполнение bin/console debug:container --env-vars также выводит его.

Это немного болезненно, так как я предполагал, что простой вызов $this->getParameter('env(BAZ)') сделает свое дело, но я предполагаю, что это имеет смысл (на самом деле нет параметра с именем env(BAZ)).

Надеюсь, это поможет кому-то еще изо всех сил пытаться обернуть голову вокруг этого.

...