В 12 строке index.php файла сценария, который Symfony 5-ой версии, создает, когда я запускаю команду symfony new <project> --full. Как показано ниже, я проверяю, если супер глобальная переменная $_SERVER [ «APP_DEBUG»] установлена в true, это позволяет использовать отладку в Symfony.
use App\Kernel;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\HttpFoundation\Request;
require dirname( __DIR__ ) . '/vendor/autoload.php';
( new Dotenv() )->bootEnv( dirname( __DIR__) . '/.env' );
if( $_SERVER[ 'APP_DEBUG' ] ) {
umask( 0000 );
Debug::enable();
} // End of if( $_SERVER[ 'APP_DEBUG' ] ) ...
$kernel = new Kernel( $_SERVER[ 'APP_ENV' ],
(bool)$_SERVER[ 'APP_DEBUG' ] );
$request = Request::createFromGlobals();
$response = $kernel->handle( $request );
$response->send();
$kernel->terminate( $request, $response );
В контроллерах, вызываемых приведенным выше кодом, я хочу использовать аналогичный тест, чтобы определить, когда мое приложение работает в режиме отладки. Но я хочу знать, когда и где $_SERVER['APP_DEBUG'] устанавливается?
На вопрос «Какие эффекты имеют константы APP_ENV и APP_DEBUG в приложении Symfony?» В bootstrap.php можно установить $_SERVER ['APP_DEBUG'], но в моем случае сценарий bootstrap.php не вызывается и не является одним из сторонних сценариев.
Если он находится в $_SERVER ['APP_ENV'] , как он туда попал?
Примечание: Какие эффекты имеют константы APP_ENV и APP_DEBUG в приложении Symfony?
Похоже, что сценарий bootstrap.php не может установить флаг отладки в $_SERVER ['APP_ENV'] , так как он не является частью установленных пакетов поставщика или он не прописан в конфигурации.
Есть где-нибудь значение по умолчанию?
Ответ 1
Раньше значение устанавливалось в файле bootstrap.php, который поставлялся с рецептами Symfony < 5.1 flex.
Начиная с Symfony 5.1 этот файл больше не включается в рецепт, и это делается компонентом DotEnv напрямую, в методе bootEnv() (который, по умолчанию, вызывается во фронт-контроллере, либо в index.php, либо в консоли).
// index.php
(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');
В документации для этого метода сказано:
Параметры env загружаются из .env.local.php, если файл существует, или из других файлов .env в противном случае.
- Этот метод также настраивает переменную env APP_DEBUG в соответствии с текущим APP_ENV.
- Правила, связанные с файлами .env, см. в методе loadEnv().
И включает в себя метод, аналогичный тому, который bootstrap.php, использовал раньше:
$k = $this->debugKey;
$debug = $_SERVER[$k] ?? !\in_array($_SERVER[$this->envKey], $this->prodEnvs, true);
$_SERVER[$k] = $_ENV[$k] = (int) $debug || (!\is_bool($debug) && filter_var($debug, \FILTER_VALIDATE_BOOLEAN)) ? '1' : '0';
В принципе, если вы не зададите это значение явно, оно будет по умолчанию равно true для "неопределенных" сред, а по умолчанию только prod является производственной средой.
Web