Laravel 5重写异常处理程序


Laravel 5 override exception handler

我想知道是否有可能在Laravel 5中重写应用程序异常处理程序类而不将其扩展到另一个类。

也许更好的说法是,我希望在异常时不调用App'Exceptions'Handler,而是调用我自己的处理程序之一。

正如Digitlimit之前提到的,Laravel附带了默认的ExceptionHandler,它可以被覆盖。有两种方法:

调整实现的ExceptionHandler

Laravel 5.8在app/Exceptions/Handler.php中实现了默认的ExceptionHandler。这个类扩展自Illuminate'Foundation'Exceptions'Handler,这是Illuminate'Contracts'Debug'ExceptionHandler接口的实际Laravel实现。通过移除父类并自己实现接口,您可以执行所有您想要的自定义异常处理。在我的回答的末尾,我包含了一个Handler类的小示例实现。

注册一个新的ExceptionHandler

实现自定义ExceptionHandler的另一种方法是覆盖可以在bootstrap/app.php中找到的默认配置。为了覆盖Larvel指定的处理程序,只需在默认的Illuminate'Contracts'Debug'ExceptionHandler::class抽象之后注册一个单例,如下所示。

# Laravel default
$app->singleton(
    Illuminate'Contracts'Debug'ExceptionHandler::class,
    App'Exceptions'Handler::class
);
# My custom handler
$app->singleton(
    Illuminate'Contracts'Debug'ExceptionHandler::class,
    App'Exceptions'MyHandler::class
);

这样做的结果是,在抛出异常的情况下调用App'Exceptions'MyHandler,并且完全跳过App'Exceptions'Handler

<标题>例子ExceptionHandler h1> 果它是有用的,我已经包含了一个自定义ExceptionHandler的小示例,以给出它的可能性的全局概念。
namespace App'Exceptions;
use Exception;
use Illuminate'Contracts'Debug'ExceptionHandler;
use Illuminate'Support'Facades'Log;
use Symfony'Component'Console'Application;
class Handler implements ExceptionHandler
{
    public function report(Exception $e)
    {
        Log::debug($e->getMessage());
    }
    public function shouldReport(Exception $e)
    {
        return true;
    }
    public function render($request, Exception $e)
    {
        return view('error.page');
    }
    public function renderForConsole($output, Exception $e)
    {
        (new Application)->renderException($e, $output);
    }
}