首页 > 解决方案 > 在 Symfony >=5.1 中 $_SERVER[ 'APP_DEBUG' ] 如何以及在哪里设置?

问题描述

index.php在我运行命令时 Symfony 版本 5 创建的脚本文件的第 12 行symfony new <project> --full,如下所示,有一个 if 测试,当$_SERVER[ 'APP_DEBUG' ] super global istrue时,启用 Symfony 的 Debug 类。

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' ]中设置调试标志,但该脚本不是已安装的供应商包或配置目录下的一部分,因此不会被调用,因此不能设置这个标志。

Nigel Ren,提供:

看起来像 .env 文件(stackoverflow.com/questions/54252210/...)。

但是,我的项目.env文件没有APP_DEBUG.

某处有默认值吗?

标签: phpsymfonydebuggingsymfony5

解决方案


bootstrap.phpSymfony <5.1 flex recipes的值曾经设置为 on 。

从 Symfony 5.1 开始,该文件不再包含在配方中,DotEnv组件直接在bootEnv()方法上完成相同的操作(默认情况下,在前端控制器中调用方法index.phpconsole)。

// index.php
(new Dotenv())->bootEnv(dirname(__DIR__) . '/.env');

该方法的文档块说:

/**
 * Loads env vars from .env.local.php if the file exists or from the other .env files otherwise.
 *
 * This method also configures the APP_DEBUG env var according to the current APP_ENV.
 *
 * See method loadEnv() for rules related to .env files.
 */

并包括与过去类似的方法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是生产环境。


推荐阅读