我有一个应用程序,其中我的控制器被分解为特定的组(API、CMS和前端),这已经使用路由器组进行了设置。我的问题是如何为每个组创建自定义错误处理。
例如,当在任何API控制器操作中发生异常时,我想发回带有错误代码和消息的json,CMS中的异常将输出详细的错误页面,前端的异常将向用户发送一般的404或500错误页面(视情况而定)。
我知道如何在每个控制器操作中手动执行此操作,但这可能会变得非常重复。理想情况下,我想为每个创建一个处理程序,并自动全面使用它。
我也知道App''Exceptions''Handler类,但例如,如果任何控制器组都可以返回ModelNotFoundException,我该如何区分异常的来源?
有没有其他地方可以插入这种类型的异常处理程序?
如果转到app'Exceptions'Handler.php
文件(您提到过),您可以随心所欲。
例如,您可以这样定义render
函数:
public function render($request, Exception $e)
{
$trace = $e->getTraceAsString();
if ($e instanceof ModelNotFoundException
&& mb_strpos($trace, 'app'Http'Controllers'WelcomeController')
) {
return response()->json('Exception ' . $e->getMessage());
} elseif ($e instanceof ModelNotFoundException) {
return "General model not found";
}
return parent::render($request, $e);
}
并添加到导入use Illuminate'Database'Eloquent'ModelNotFoundException;
现在,如果你在WelcomeController
中抛出ModelNotFoundException
,或者你从WelcomeController
中运行另一个类的方法,这个方法会抛出ModelNotFoundException
,你可以跟踪它并返回json
响应。在其他情况下,若异常将是ModelNotFoundException
的实例,则可以用其他方式呈现异常,在所有其他情况下都可以使用标准异常方法进行呈现。
这样,您就不需要在控制器中定义任何内容,只需在Handler
中即可完成,而且更复杂的是,您可以创建单独的方法或创建新的类来以您想要的方式处理特定的异常,并在该处理程序中运行它们。