Как изменить среду приложения во время выполнения? - PullRequest
0 голосов
/ 22 мая 2018

Как я могу изменить среду приложения во время выполнения?

У меня есть некоторые классы, которые привязываются только к поставщику услуг на производстве.Я хотел бы подтвердить с помощью модульного теста, что они правильно связаны.Для других переменных среды я могу установить их с помощью помощника config, а затем просто вызвать resetApplication в tearDown, но по какой-то причине переменная, установленная APP_ENV, не изменится.

dump(app()->environment()); // "testing"

config(['app.env' => 'production']);

dump(app()->environment()); // "testing"

Что я могу сделать, чтобы app()->environment() вернул production во время выполнения?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Я заметил, что приведенный выше ответ может быть немного опасным: вы можете перезаписывать ключ 'env', не переключая среды.Внезапно ваше приложение сообщает, что вы тестируете, в то время как ваше соединение с БД все еще настроено на работу.

Обычно вы просто хотите действительно придерживаться наилучшей практики Laravel по определению ОДНОЙ среды для каждой литеральной среды, но для моегосценарий использования, необходимый для временного и программного переключения между несколькими средами в рамках одного сценария кустарного промысла.

Мое решение (работает в Laravel 5.8+ с DotEnv3) состоит в том, чтобы действительно перезагрузить приложение:

<?php

$basepath = app()->basePath();
$env = app()->basePath('.env.alternative');
$boot = app()->basePath('bootstrap/app.php');

// Overwrite webserver env
(new Dotenv($basepath,'.env.alternative'))->overload();

// Reboot the application
(require $boot)
    ->loadEnvironmentFrom($env)
    ->make(Kernel::class)
    ->bootstrap();

// This returns 'mysql_alternative', as defined in .env.alternative
dd(DB::connection()->getName())

Отказ от ответственности: я проверял это только в рамках своего собственного кода.

0 голосов
/ 23 мая 2018

app()->environment() читает напрямую из переменных, указанных в вашем файле .env, а не в файлах конфигурации.

Вы можете использовать два подхода для решения вашей проблемы.

1.Считайте переменные среды из файла конфигурации, а не из файла .env.

dump(config('app.env')); // "testing"

config(['app.env' => 'production']);

dump(config('app.env')); // "production"

2.Измените значение 'env' в текущем экземпляре приложения, изменив значение app()['env'].

dump(app()->environment()); // "testing"

app()['env'] = 'production';

dump(app()->environment()); // "production"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...