Laravel 5 控制器异常处理程序

Laravel 5 controller exception handler

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

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

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

我也知道 App\Exceptions\Handler class,但是如果任何控制器组可以 return 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 的另一个 class' 方法,这个方法将抛出 ModelNotFoundException 你可以跟踪它并 return json 响应。在其他情况下,如果异常将是 ModelNotFoundException 的实例,您可以以其他方式呈现您的异常,在所有其他情况下,您可以使用标准异常方法来呈现。

这样你就不需要在你的控制器中定义任何东西,你可以在 Handler 中完成它并且它更复杂你可以创建单独的方法或创建新的 classes以您想要的方式处理特定异常,并在此处理程序中 运行 它们。