Php Yi2 API服务的非可视错误处理程序
我正在Yii2中开发web API服务,我希望我的Yii2应用程序将被其他程序使用(例如,由托管在其他域/应用程序中的React SPA应用程序使用),而不是由人类最终用户使用。因此,我不需要Yii2默认错误处理页面(在调试模式下默认启用),它以人类可读的形式显示堆栈跟踪。相反,我需要以API的方式返回任何错误信息,例如,作为机器可读的结构化JSON响应 这就是我尝试代码的原因: 我在config/web.php中有配置:Php Yi2 API服务的非可视错误处理程序,php,rest,error-handling,yii2,Php,Rest,Error Handling,Yii2,我正在Yii2中开发web API服务,我希望我的Yii2应用程序将被其他程序使用(例如,由托管在其他域/应用程序中的React SPA应用程序使用),而不是由人类最终用户使用。因此,我不需要Yii2默认错误处理页面(在调试模式下默认启用),它以人类可读的形式显示堆栈跟踪。相反,我需要以API的方式返回任何错误信息,例如,作为机器可读的结构化JSON响应 这就是我尝试代码的原因: 我在config/web.php中有配置: 'errorHandler' => [ 'errorAct
'errorHandler' => [
'errorAction' => 'site/error',
],
我还有SiteController.php操作:
public function actionError() {
$exception = Yii::$app->errorHandler;
return json_encode($exception);
}
我在其他操作中有异常引发代码:
public function actionTest() {
$test = [];
$test1 = $test['form_id']; //Exception Undefined index: form_id
return 'OK';
}
按我的操作错误显示错误:
{
"maxSourceLines": 19,
"maxTraceSourceLines": 13,
"errorAction": "site\/error",
"errorView": "@yii\/views\/errorHandler\/error.php",
"exceptionView": "@yii\/views\/errorHandler\/exception.php",
"callStackItemView": "@yii\/views\/errorHandler\/callStackItem.php",
"previousExceptionView": "@yii\/views\/errorHandler\/previousException.php",
"displayVars": ["_GET", "_POST", "_FILES", "_COOKIE", "_SESSION"],
"traceLine": "{html}",
"discardExistingOutput": true,
"memoryReserveSize": 262144,
"exception": {}
}
所以,问题是,这是一条非常没有信息的消息,没有错误代码,没有错误描述,没有堆栈跟踪,对于其他应用程序来说没有任何价值,显然
异常
结构是空的。如何在SiteController.actionError中获取一些错误信息,以便将其转换为API客户可以使用的技术消息?您不需要执行自己的错误操作来生成不同格式的响应。默认错误操作根据Yii::$app->response->format
调整输出
public function actionMyAction()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
throw new \yii\base\Exception('test');
}
此代码将生成json输出,如下所示:
{
"name":"Exception",
"message": "test",
"code":0,
"type":"yii\\base\\Exception",
"file":"D:\\path\\to\\controllers\\TestController.php",
"line":20,
"stack-trace":
[
...
]
}
您不需要执行自己的错误操作来生成不同格式的响应。默认错误操作根据
Yii::$app->response->format
调整输出
public function actionMyAction()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
throw new \yii\base\Exception('test');
}
此代码将生成json输出,如下所示:
{
"name":"Exception",
"message": "test",
"code":0,
"type":"yii\\base\\Exception",
"file":"D:\\path\\to\\controllers\\TestController.php",
"line":20,
"stack-trace":
[
...
]
}