Php Laravel 5控制器异常处理程序

Php Laravel 5控制器异常处理程序,php,laravel,exception-handling,laravel-5,Php,Laravel,Exception Handling,Laravel 5,我有一个应用程序,其中我的控制器被分成特定的组(API、CMS和前端),这已经使用路由器组进行了设置。我的问题是如何为每个组创建自定义错误处理 例如,当在任何API控制器操作中发生异常时,我想发送回json并带有错误代码和消息,CMS中的异常将输出一个详细的错误页面,前端的异常将用户发送到一个通用的404或500错误页面(视情况而定) 我知道如何在每个控制器操作中手动执行此操作,但这可能会变得非常重复。理想情况下,我希望为每个处理器创建一个处理程序,并自动在整个系统中使用它 我也知道App\Ex

我有一个应用程序,其中我的控制器被分成特定的组(API、CMS和前端),这已经使用路由器组进行了设置。我的问题是如何为每个组创建自定义错误处理

例如,当在任何API控制器操作中发生异常时,我想发送回json并带有错误代码和消息,CMS中的异常将输出一个详细的错误页面,前端的异常将用户发送到一个通用的404或500错误页面(视情况而定)

我知道如何在每个控制器操作中手动执行此操作,但这可能会变得非常重复。理想情况下,我希望为每个处理器创建一个处理程序,并自动在整个系统中使用它

我也知道App\Exceptions\Handler类,但如果任何控制器组都可以返回ModelNotFoundException,例如,我如何区分异常来自何处


还有其他地方可以插入这种类型的异常处理程序吗?

如果您转到
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);
}
并添加到imports
use-illumb\Database\Eloquent\ModelNotFoundException

现在,如果您在
WelcomeController
中抛出
ModelNotFoundException
,或者您从
WelcomeController
运行另一个class'方法,此方法将抛出
ModelNotFoundException
,您可以跟踪它并返回
json
响应。在其他情况下,如果异常将是
ModelNotFoundException
的实例,则可以以其他方式呈现异常,在所有其他情况下,可以使用标准异常方法呈现异常


这样,您不需要在控制器中定义任何内容,只需在
处理程序中定义即可。更复杂的是,您可以创建单独的方法或创建新的类,以您想要的方式处理特定的异常,并在该处理程序中运行它们。

这似乎工作得相当不错。由于我的控制器是按其组名命名的,因此我应该能够全面搜索这些控制器(例如App\Http\controllers\Api)。下面的问题:当我使用路由模型绑定而未找到模型时,如何捕获ModelNotFoundException?我的控制器将不在堆栈跟踪中,因为错误发生在加载控制器之前。@frasmage您可能会抛出自己的异常以使其更简单:我有一个与此问题非常相似的版本,我有一个充满XML和JSON返回方法的控制器。我需要捕获所有错误,并根据控制器的操作以JSON或XML显示错误代码和错误消息。真的很难找到干净的方法。