我想知道是否可以覆盖Laravel 5中的应用程序异常处理程序类而不将其扩展到另一个类。
也许更好的方式是说我喜欢它,这样就不会在异常上调用App\Exceptions\Handler
而是我自己的处理程序。
提前致谢。
答案 0 :(得分:0)
如Digitlimit here之前所述,Laravel附带了默认的ExceptionHandler,可以将其覆盖。有两种方法可以做到:
Laravel 5.8附带了在app/Exceptions/Handler.php
中实现的默认ExceptionHandler。此类从Illuminate\Foundation\Exceptions\Handler
扩展,它是Illuminate\Contracts\Debug\ExceptionHandler
接口的实际Laravel实现。通过删除父类并自己实现接口,您可以执行所有想要的自定义异常处理。我在回答的末尾包含了Handler类的一个小示例实现。
实现自定义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的小例子,以全面了解它的可能性。
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);
}
}