【问题标题】:Laravel 5 controller exception handlerLaravel 5 控制器异常处理程序
【发布时间】:2015-05-07 07:29:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我有一个与这个问题非常相似的版本,我有一个充满 XML 和 JSON 返回方法的控制器。我需要捕获所有错误并以 JSON 或 XML 格式显示错误代码和错误消息,具体取决于哪个控制器操作。真的很难找到一种干净利落的方法。

标签: php laravel exception-handling laravel-5


【解决方案1】:

如果你去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中做它更复杂的是你可以创建单独的方法或创建新的类来以你想要的方式处理特定的异常,并且在这个处理程序中运行它们。

【讨论】:

  • 这似乎运作良好。由于我的控制器是按其组名命名的,因此我应该能够全面搜索这些控制器(例如 App\Http\Controllers\Api)。
  • 后续问题:当我使用路由模型绑定但未找到模型时,如何捕获发生的 ModelNotFoundExceptions?我的控制器不会出现在堆栈跟踪中,因为错误发生在控制器加载之前。
  • @frasmage 您可能会抛出自己的异常以使其更容易:laravel.com/docs/4.2/routing#route-model-binding
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2021-03-20
相关资源
最近更新 更多