Laravel 5覆盖异常处理程序

时间:2015-08-11 07:00:39

标签: php laravel exception-handling laravel-5

我想知道是否可以覆盖Laravel 5中的应用程序异常处理程序类而不将其扩展到另一个类。

也许更好的方式是说我喜欢它,这样就不会在异常上调用App\Exceptions\Handler而是我自己的处理程序。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如Digitlimit here之前所述,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

在这种情况下很有用,我提供了一个自定义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);
    }
}