Фронтальный контроллер index.phpпо умолчанию:
// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
(new Dotenv())->load(__DIR__.'/../.env');
}
В чем причина этого? Почему файл .env следует игнорировать в производственной среде?






Идея .env заключается в том, что он должен в первую очередь использоваться в среды разработки и тестирования, потому что в других средах, таких как производственный или промежуточный веб-сервер, вы должны иметь возможность настраивать эти переменные извне. Например, Nginx позволяет вам использует директиву env в ваших файлах конфигурации для настройки переменных, которые приложение сможет использовать.
Я думаю, что причина, по которой Symfony выбрала такой подход к .env, заключается в том, что он позволяет унифицировать способ переменных для любой среды выполнения, которую может иметь разработчик. А также помните, что при производственном развертывании переменные среды являются первоклассными, довольно распространенными и не меняются довольно часто.
Другая вещь здесь - безопасность: конфигурации сервера должны быть более безопасными, чем исходный код вашего приложения Symfony. Например. как человек, у которого есть доступ к файловой системе к корню приложения на вашем prod-сервере, вы можете украсть учетные данные базы данных, если они просто хранятся в .env, но вы не сможете получить к ним доступ, если они хранятся где-то в безопасном месте в конфигурации сервера, вне корня приложения.
В любом случае, если вы готовы рискнуть и раскрыть свою конфигурацию на производственной машине всем, у кого есть доступ к .env, вы все равно можете включить .env в своей промежуточной или производственной среде. Для этого вы должны удалить или закомментировать эти строки в index.php:
// Comment out the if statement so the code gets run every time:
// if (!isset($_SERVER['APP_ENV'])) {
(new Dotenv())->load(__DIR__.'/../.env');
// }
Кроме того, вам придется переместить зависимость DotEnv из зависимостей require-dev в раздел require в вашем composer.json:
{
"type": "project",
"license": "proprietary",
"require": {
...
"symfony/dotenv": "^4.0",
...
}
Ага. Если вы хотите использовать .env, вам нужно будет настроить composer.json, чтобы использовать его. Также будет небольшое снижение производительности, поскольку файл .env придется анализировать при каждом запросе. Но это сработает.
Спасибо за обновления; deps композитора не проверял, дополню ответ с учетом этих фактов
Похоже, они намеренно сделали компонент DotEnv для разработки только в
require-devв файлеcomposer.json.