Php Laravel 5控制器异常处理程序
我有一个应用程序,其中我的控制器被分成特定的组(API、CMS和前端),这已经使用路由器组进行了设置。我的问题是如何为每个组创建自定义错误处理 例如,当在任何API控制器操作中发生异常时,我想发送回json并带有错误代码和消息,CMS中的异常将输出一个详细的错误页面,前端的异常将用户发送到一个通用的404或500错误页面(视情况而定) 我知道如何在每个控制器操作中手动执行此操作,但这可能会变得非常重复。理想情况下,我希望为每个处理器创建一个处理程序,并自动在整个系统中使用它 我也知道App\Exceptions\Handler类,但如果任何控制器组都可以返回ModelNotFoundException,例如,我如何区分异常来自何处Php Laravel 5控制器异常处理程序,php,laravel,exception-handling,laravel-5,Php,Laravel,Exception Handling,Laravel 5,我有一个应用程序,其中我的控制器被分成特定的组(API、CMS和前端),这已经使用路由器组进行了设置。我的问题是如何为每个组创建自定义错误处理 例如,当在任何API控制器操作中发生异常时,我想发送回json并带有错误代码和消息,CMS中的异常将输出一个详细的错误页面,前端的异常将用户发送到一个通用的404或500错误页面(视情况而定) 我知道如何在每个控制器操作中手动执行此操作,但这可能会变得非常重复。理想情况下,我希望为每个处理器创建一个处理程序,并自动在整个系统中使用它 我也知道App\Ex
还有其他地方可以插入这种类型的异常处理程序吗?如果您转到
app\Exceptions\handler.php
文件(您提到的),您可以随心所欲地执行
例如,您可以通过以下方式定义渲染
函数:
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);
}
并添加到importsuse-illumb\Database\Eloquent\ModelNotFoundException代码>
现在,如果您在WelcomeController
中抛出ModelNotFoundException
,或者您从WelcomeController
运行另一个class'方法,此方法将抛出ModelNotFoundException
,您可以跟踪它并返回json
响应。在其他情况下,如果异常将是ModelNotFoundException
的实例,则可以以其他方式呈现异常,在所有其他情况下,可以使用标准异常方法呈现异常
这样,您不需要在控制器中定义任何内容,只需在处理程序中定义即可。更复杂的是,您可以创建单独的方法或创建新的类,以您想要的方式处理特定的异常,并在该处理程序中运行它们。这似乎工作得相当不错。由于我的控制器是按其组名命名的,因此我应该能够全面搜索这些控制器(例如App\Http\controllers\Api)。下面的问题:当我使用路由模型绑定而未找到模型时,如何捕获ModelNotFoundException?我的控制器将不在堆栈跟踪中,因为错误发生在加载控制器之前。@frasmage您可能会抛出自己的异常以使其更简单:我有一个与此问题非常相似的版本,我有一个充满XML和JSON返回方法的控制器。我需要捕获所有错误,并根据控制器的操作以JSON或XML显示错误代码和错误消息。真的很难找到干净的方法。