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以您想要的方式处理特定异常,并在此处理程序中 运行 它们。
我有一个应用程序,其中我的控制器被分成特定的组(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以您想要的方式处理特定异常,并在此处理程序中 运行 它们。