Forwarded from Beer::PHP 🍺 (Кирилл Сулимовский)
Symfony .env и как его готовить
Чем больше я сталкиваюсь с проектами, тем больше вижу, что мало кто использует .env в Symfony так, как это рекомендуют в документации фреймворка. Решил остановиться на этом подробнее.
❓Как было всегда?
В Symfony до 2018 года и во многих других фреймворках мы использовали комбинацию
С какими проблемами можно столкнуться?
📌 При развертке проекта. Не смотря на то, что названия переменных есть, но сами значения надо где-то взять. Приходится что-то придумывать, у кого-то спрашивать, лезть в разные конфиги, что не очень удобно. Конечно многие выкручиваются тем, что добавляют их прямо в dist, а потом перезаписывают руками.
📌 При добавлении новой переменной всем разработчикам следует сразу добавить её в свой
👉 В целом со всем этим можно жить и нет критических проблем, но что предлагают ребята из Symfony?
❗️ Первое, что бросается в глаза, это коммитить(!)
❓ А если даже для локалки не все данные можно коммитить?
👉 Для этого необходимо создать файл
👉 Для каждой среды вы можете сделать свои файлы, например
👍 Фишки:
📌 При установке некоторых пакетов заботливый Symfony Flex будет сразу добавлять в ваш
📌 Реальные переменные окружения (export) имеют преимущество над переменными из файлов. Если нужно — вы можете спокойно экспортировать переменные или сделать source .env и отказаться от использования файла.
📌 Чтобы ускорить продакшн можно использовать
📌 Вы можете переиспользовать уже объявленные переменные внутри своего
Чем больше я сталкиваюсь с проектами, тем больше вижу, что мало кто использует .env в Symfony так, как это рекомендуют в документации фреймворка. Решил остановиться на этом подробнее.
❓Как было всегда?
В Symfony до 2018 года и во многих других фреймворках мы использовали комбинацию
.env
и .env.dist
(или .env.example
). При этом сам .env
не коммится в репозиторий (что логично), а .env.dist
имел, как правило, только набор переменных и пустых значений.С какими проблемами можно столкнуться?
📌 При развертке проекта. Не смотря на то, что названия переменных есть, но сами значения надо где-то взять. Приходится что-то придумывать, у кого-то спрашивать, лезть в разные конфиги, что не очень удобно. Конечно многие выкручиваются тем, что добавляют их прямо в dist, а потом перезаписывают руками.
📌 При добавлении новой переменной всем разработчикам следует сразу добавить её в свой
.env
, иначе при использовании в контейнере мы быстро отловим Exception
. Конечно это тоже можно обойти и задать дефолтные значения прямо в yml.👉 В целом со всем этим можно жить и нет критических проблем, но что предлагают ребята из Symfony?
❗️ Первое, что бросается в глаза, это коммитить(!)
.env
. Но спокойно, это сделано, чтобы в данный файл можно было внести настройки по-умолчанию для локальной разработки. ❓ А если даже для локалки не все данные можно коммитить?
👉 Для этого необходимо создать файл
.env.local
, который будет иметь более высокий приоритет, чем .env
, а значит переопределит заданные переменные. Там можно перезаписать необходимые переменные. Все файлы ".local
" не коммитятся, то есть для каждого отдельного сервака/компа можно создать и использовать свой .env.local
.👉 Для каждой среды вы можете сделать свои файлы, например
.env.dev
, .env.test
, .env.prod
, они также переопределять дефолтные значения, но только в рамках заданного окружения. Эти файлы также коммитятся. Таким образом можно выстроить гибкую иерархию дефолтных значений на все случаи жизни.👍 Фишки:
📌 При установке некоторых пакетов заботливый Symfony Flex будет сразу добавлять в ваш
.env
файл необходимые переменные, чтобы вы не забыли об этом. Например после установки Sentry composer require sentry/sentry-symfony
, в env появятся вот такие строки.📌 Реальные переменные окружения (export) имеют преимущество над переменными из файлов. Если нужно — вы можете спокойно экспортировать переменные или сделать source .env и отказаться от использования файла.
📌 Чтобы ускорить продакшн можно использовать
composer dump-env prod
, который создаст .env.local.php
. Это позволит не тратить лишние ресурсы на парсинг .env
файла при каждом запросе.📌 Вы можете переиспользовать уже объявленные переменные внутри своего
.env
, например:DB_USER=root#php #symfony #env #middle #source
DB_PASS=${DB_USER}-password # присвоит значение root-password