Laravel 5控制器异常处理程序

时间:2015-03-05 19:32:17

标签: php laravel exception-handling laravel-5

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

如果你转到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;

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

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