Php Yi2 API服务的非可视错误处理程序

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

我正在Yii2中开发web API服务,我希望我的Yii2应用程序将被其他程序使用(例如,由托管在其他域/应用程序中的React SPA应用程序使用),而不是由人类最终用户使用。因此,我不需要Yii2默认错误处理页面(在调试模式下默认启用),它以人类可读的形式显示堆栈跟踪。相反,我需要以API的方式返回任何错误信息,例如,作为机器可读的结构化JSON响应

这就是我尝试代码的原因: 我在config/web.php中有配置:

'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":
  [
    ...
  ]
}