禁用Laravel的内置错误处理方法

2022-08-30 14:48:23

是否无论如何都可以一起禁用Laravel错误处理程序?

我想简单地显示标准的PHP错误而不是错误。Whoops, looks like something went wrong


答案 1

并非没有严重违反框架的原则(如果您仍然感兴趣,我将在下面告诉您如何操作)。

有几件事使这很难完成。取消设置默认错误和异常处理程序非常简单

set_error_handler(null);
set_exception_handler(null);

但这给你留下了两个主要障碍。

第一个是 Laravel 注册一个关闭处理程序作为其引导的一部分,此关闭函数将查找最后一个错误,如果它是致命错误,请手动调用异常处理代码。取消注册关机功能并不容易

第二个是,主要的Laravel应用程序处理程序看起来像这样

#File: vendor/laravel/framework/src/Illuminate/Foundation/Application.php
public function handle(SymfonyRequest $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
    try
    {
        $this->refreshRequest($request = Request::createFromBase($request));

        $this->boot();

        return $this->dispatch($request);
    }
    catch (\Exception $e)
    {
        if ($this->runningUnitTests()) throw $e;

        return $this['exception']->handleException($e);
    }
}

也就是说,如果应用程序代码引发异常,Laravel 会在此处捕获它并手动调用异常的方法(这会触发标准的 Laravel 异常处理)。没有办法让PHP处理应用程序中发生的致命异常,Laravel阻止了这种情况的发生。handleException

我告诉你如何做你想做的事的部分

所有这些都意味着我们需要用我们自己的应用程序替换主要的Laravel应用程序。在 中,有以下行bootstrap/start.php

#File: bootstrap/start.php
$app = new Illuminate\Foundation\Application;

将其替换为以下内容

ini_set('display_errors','1');
class MyApplication extends Illuminate\Foundation\Application
{
    function startExceptionHandling()
    {
        //do nothing
    }

    public function handle(Symfony\Component\HttpFoundation\Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->refreshRequest($request = Request::createFromBase($request));

        $this->boot();

        return $this->dispatch($request);
    }    
}

$app = new MyApplication;

我们要做的第一件事是将 PHP 的显示错误 ini 设置为 。这可确保将错误输出到浏览器。1

接下来,我们将定义一个新的应用程序类,用于扩展实际的应用程序类。

最后,我们将真正的Laravel对象替换为由我们的类实例化的对象。$app

在我们的应用程序类本身中,我们清空了。这可以防止 Laravel 设置自定义异常、错误和关机回调。我们还定义了从 try/catch 中删除应用程序启动/调度。这是该过程中最脆弱的部分,根据您的Laravel版本,可能会有所不同。startExceptionHandlinghandle

最终警告

如果方法在Laravel的未来版本中发生变化,这将中断。handle

如果自定义包依赖于添加自定义异常处理程序,则它们可能会中断。

我建议远离这一点,除了临时调试技术之外。


答案 2

然后在 \config\local\app 中设置 'debug' => false.php

<?php

return array(

    'debug' => false,

);

推荐