Не используйте env() вне файлов конфигурации
На форумах по Laravel я часто вижу несколько однотипных вопросов, связанных с использованием функции env()
.
Звучат они примерно так:
.env иногда не читает переменные
env()/getenv() иногда не инициализированы
я изменил имя базы данных в .env-файле, но ничего не произошло
Возможно, это случалось и с вами. Надеюсь, к концу этого поста вы будете знать, почему так происходит и как этого избежать.
Кэширование конфигурации
На странице документации по развертыванию Laravel упоминается оптимизация загрузки конфигурации, и если вы будете следовать этой документации, то, скорее всего, выполните следующую команду при развертывании сайта на продакшене:
php artisan config:cache
Вы можете спросить, какое отношение это имеет к функции env()
?
Когда вы кэшируете конфигурацию, Laravel объединяет все ваши конфигурационные файлы в один для повышения производительности, но еще один эффект, который дает эта команда, заключается в том, что Laravel перестает читать ваш файл .env
. Это означает, что функция env()
не будет возвращать значения, которые вы указали в файле .env
.
Отказываемся от .env файла
Означает ли это, что вам следует вообще отказаться от использования файла .env
?
Нет, это означает только то, что вам следует прекратить использовать функцию env()
в вашем коде и вместо этого использовать ее только в файлах конфигурации.
Вместо того чтобы делать что-то вроде:
Stripe::setApiKey(env('STRIPE_API_KEY'));
Вам следует поступать так:
Stripe::setApiKey(config('services.stripe.api_key'));
А затем просто добавить вызов env()
в свой конфигурационный файл:
// config/services.php
return [
...
'stripe' => [
'api_key' => env('STRIPE_API_KEY'),
]
];
Теперь все должно работать так, как и ожидалось.
Файл .env в продакшене
Что делать, если вы захотите изменить файл .env
в проде?
В этом случае вы можете запустить команду cache
снова после изменения файла:
php artisan config:cache
Если по какой-то причине вам нужно удалить кэш, вы можете сделать это с помощью следующей команды:
php artisan config:clear
Источник: You should never use env() outside of your config files.