Laravel не читает переменные env из разных файлов env

После обновления с 5.0 до 5.8 laravel перестал читать переменные env, если env отличается от файла .env.

Например, если у меня есть файл .env с USE_SSL=true внутри него. env('USE_SSL') будет правдой

Но если у меня есть файл .env, указывающий на другую среду:

APP_ENV=dev

и тогда у меня будет .env.dev файл, содержащий USE_SSL=true , env('USE_SSL') будет нулевым.

  1. Пробовал и composer dump-autoload и php artisan config:clear, и php artisan config:cache - не повезло. кешируется или нет, я не могу получить значение.
  2. Я попытался назвать файлы .dev.env и .env.dev - безуспешно.

Любые идеи были бы хорошы.

После кэширования конфигурации файл .env не будет загружен, и все вызовы функции env будут возвращать значение null: см. документ.

jcheron 18.07.2019 16:37

@jcHache я добавил значение, а затем кэшировал его, но я добавил его при редактировании, чтобы избежать путаницы.

jvrnt 18.07.2019 16:40

В другой части той же документации указано: если вы выполняете команду config:cache в процессе развертывания, вы должны быть уверены, что вызываете функцию env только из файлов конфигурации. Откуда вы звоните env?

jcheron 18.07.2019 16:49

Я не выполняю его в развертывании

jvrnt 18.07.2019 16:50

А где твой env звонок?

jcheron 18.07.2019 17:01

Я не думаю, что такой подход с цепочкой .env работает, так как в любом случае это не то, как вы должны использовать .env.

ceejayoz 18.07.2019 17:23

А здесь нет ответа? stackoverflow.com/questions/34420761/…

jcheron 18.07.2019 17:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
1 419
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, если ты действительно хотел это сделать,

Route::get('renderEnvChaining',function(){
    $myCustomEnv = parse_ini_file(base_path(env('CUSTOM_ENV')));
   return $myCustomEnv['USE_SSL']; // This will return true
});

В моем файле .env я упомянул об этом,

CUSTOM_ENV=.env.example

Теперь я по умолчанию env.example я поставил это

USE_SSL = "true"  // This will return true
USE_SSL=true    // This will return 1

Я только что обнаружил, что .ini и .env имеют одинаковые значения, поэтому я проанализировал файл .env как файл .ini,

Попробуйте, я никогда раньше этого не делал, пожалуйста, посоветуйтесь с другими разработчиками, прежде чем запускать это на рабочем сервере.

Некоторые причины. Во-первых, .env файлы — это не .ini файлы. Существуют различия, например, как вы указываете комментарий, поэтому использование parse_ini_file может вызвать проблемы. Во-вторых, предлагаемый вами подход не заполняет переменные среды. В-третьих, он работает только на одном рассматриваемом маршруте.

ceejayoz 19.07.2019 14:43

@ceejayoz Спасибо, что заставили меня ясно это понять. Хорошо, а что, если я использую этот пакет github.com/vlucas/phpdotenv для загрузки файла env, будет ли это хорошим подходом? и я знаю, что они оба разные, и они работают по-разному. Здесь я нашел хорошее решение для загрузки пользовательской среды с пакетом stackoverflow.com/a/38824174/5928015, последнее, что я должен обновить свой ответ, используя пакеты, или я должен удалить его за введение в заблуждение?

Vipertecpro 19.07.2019 16:57

В конечном счете, я думаю, что сам вопрос ошибочен, поскольку он основан на непонимании того, как предполагается использовать .env. У каждого компьютера (локального разработчика или сервера) есть свой .env. Ваш может отличаться от моего, даже для одного и того же приложения. Решение для специфичных для разработчиков настроек — просто поместить их в основной файл .env на сервере разработки.

ceejayoz 19.07.2019 17:00

Да, это то, что я узнаю из документа laravel. Файл .env предназначен только для настройки дескриптора, без .env мы должны вручную записывать значения в каждый из файлов папки конфигурации, таких как database.php и т. д. Так кто-нибудь собирается закрыть этот вопрос? потому что то, что фреймворк дает по умолчанию, мы всегда должны переопределять и расширять его методы, верно?

Vipertecpro 19.07.2019 17:07
Ответ принят как подходящий

Я добавляю это как ответ, но обратите внимание на этот не, как файл .env следует использовать в соответствии с документами laravel. Это просто способ, который мне нужно было использовать из-за некоторых ограничений, которые требовали от меня использования разных файлов конфигурации для каждой среды и загрузки их во время выполнения. Для корректного использования файла .env проверьте файл документы.

Это способ загрузки различных файлов конфигурации во время выполнения зависит от того, куда указывает APP_ENV. Я отмечаю это как ответ, так как он отвечает на этот конкретный вопрос.

.env

APP_ENV=specific_domain

.env.специфический_домен

USE_SSL=true

http/ядро.php

public function __construct(Application $app, Router $router)
{
    parent::__construct($app, $router);

    $app_env = explode(" = ", file($app->environmentFilePath(), FILE_IGNORE_NEW_LINES)[0])[1];
    $app->loadEnvironmentFrom(".env.$app_env");

}

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