Symfony 4 - автоматически меняет среду по IP

У нас есть три сервера разработки (dev1, dev2, stage) и один рабочий сервер, а также несколько проектов Symfony.

Мы хотели бы изменить среду автоматически. В настоящее время мой хак выглядит так в 'public/index.php'

use App\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;

require __DIR__.'/../vendor/autoload.php';

//----------- hack start ------------

$_SERVER['APP_ENV'] = 'prod';
$_SERVER['APP_DEBUG'] = 0;
$_SERVER['APP_SECRET'] = '67d829bf61dc5f87a73fd814e2c9f629';

$localIP = getHostByName(getHostName());
if ($localIP === '81.4.552.97') {
     $_SERVER['APP_ENV'] = 'dev1';
     $_SERVER['APP_DEBUG'] = 1;
     $_SERVER['APP_SECRET'] = '67d829bf61dc5f87a73fd814e2c9f629';
}

...

//----------- hack end ------------

// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
    (new Dotenv())->load(__DIR__.'/../.env');
}

if ($_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev'))) {
    umask(0000);

    Debug::enable();
}

// Request::setTrustedProxies(['0.0.0.0/0'], Request::HEADER_FORWARDED);

$kernel = new Kernel($_SERVER['APP_ENV'] ?? 'dev', $_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev')));
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

и у меня есть три новых окружения в "config/packages/*", включая конфигурацию для базы данных и электронной почты.

Это правильный путь? Может быть, некоторые другие также имеют эту проблему. Я только что проверил его под dev1, кажется, работает.

2 ответа

Самый простой способ, наверное, - задать окружение HTTP-сервером. Для Apache в.htaccess:

SetEnvIf Remote_Addr 1\.2\.3\.4 APP_ENV=dev
SetEnvIf Remote_Addr 1\.2\.3\.4 APP_DEBUG=1

Остальное в .env.dev

В настоящее время я думаю, что лучшим решением является удаление dotenvcomposer remove symfony/apache-pack и добавить требование в public/index.php а также bin/console

use App\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;

require __DIR__.'/../env.php';   
require __DIR__.'/../vendor/autoload.php';

// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
    (new Dotenv())->load(__DIR__.'/../.env');
}
...

в этом env.php Я могу объявить все серверные переменные для сред

$_SERVER['APP_ENV'] = 'xxx';
$_SERVER['MAILER_URL'] = 'null://localhost';
$_SERVER['APP_SECRET'] = '425017d316ee2a08e54c6f2bfc59ff8d';
$_SERVER['DATABASE_URL'] = 'xxx';

Я думаю, что это хорошее и быстрое решение. (если php не установлен когда-нибудь, сервер apache не отправит файл со всеми конфигами;))

Почему бы просто не использовать переменные среды?

https://symfony.com/doc/current/configuration/external_parameters.html

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