在 Laravel 4 中运行时设置 debug => true 时出现问题


Problems setting debug => true at runtime in Laravel 4

在Laravel 4中,我想默认将配置变量"debug"设置为"false",但对于来自我自己的IP地址的请求设置为"true"(测试最终会比这更复杂)。

根据 http://four.laravel.com/docs/configuration 的文档,我尝试了以下方法:

配置/应用程序.php:

'debug' => false

filters.app - App::before(我也尝试将代码放在路由.php的顶部,具有相同的效果):

if(Request::getClientIp() == '[my ip address]') {
  echo 'hello world';
  Config::set('app.debug', true);
}
echo Config::get('app.debug');

当我访问一个错误的 URL 时,我看到"hello world"和"1",所以这很好,但随后只有公共(非调试)错误消息显示在下面。

我知道在运行时设置的配置变量仅适用于单个请求,但由于我的"hello world"正在显示,这似乎是一个请求。

有没有更好的地方来放置我的代码,或者我正在做的事情实际上是不可能的?

这似乎是你可以用Laravel的环境检测来完成的事情(从你链接的页面:http://four.laravel.com/docs/configuration#environment-configuration)。

使用环境,你决定一个名称——你可以调用你的debugging——然后将该环境的配置文件放在配置目录的子目录中。因此,在您上面给出的情况下,您将app.php配置文件复制到/app/config/debugging/app.php(以及您想要的任何其他文件),并进行必要的配置更改。

然后,重要的步骤是检测环境,以便应用将使用debugging配置文件。这在 /bootstrap/start.php 中指定。您可以将闭包而不是数组传递给 Laravel 的环境检测,并返回要使用的环境名称,因此您可以从上面使用您的方法,如下所示:

$env = $app->detectEnvironment(function()
{
    if ($_SERVER['REMOTE_ADDR'] === '[my ip address]') {
        return 'debugging';
    }
});

我还没有测试过它,但它应该可以工作。希望对您有所帮助!

在深入研究异常处理程序之后,我发现这是可靠的:

  Config::set('app.debug', true);
  app()->startExceptionHandling();

为什么采用这种方法?因为Laravel在启动时绑定了异常处理程序(以避免PHP内部破坏东西),所以你需要伪造该部分的重新启动。

附言。我正在恢复这个老问题,因为我认为公认的答案是不准确的。它不允许你在运行时启用调试,我无法通过查看系统变量来检测用户是否是员工。