我想知道是否有可能在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
。
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);
}
}
标题>