<?php
return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];
这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。
代码查看:yii\web\ErrorHandler::renderException
<?php
protected function renderException($exception)
{
if (Yii::$app->has('response')) {
$response = Yii::$app->getResponse();
// reset parameters of response to avoid interference with partially created response data
// in case the error occurred while sending the response.
$response->isSent = false;
$response->stream = null;
$response->data = null;
$response->content = null;
} else {
$response = new Response();
}
$response->setStatusCodeByException($exception);
$useErrorView = $response->format === Response::FORMAT_HTML && (!YII_DEBUG || $exception instanceof UserException);
}
就是$response->format === Response::FORMAT_HTML 这个判断等于false,问题来了,为什么是false?
原因是:在 Yii 框架中,yii\rest\ActiveController 继承自 yii\rest\Controller。这意味着 ActiveController 继承了 Controller 的所有功能,并在此基础上添加了一些针对 RESTful API 的功能。
public function behaviors()
{
return [
'contentNegotiator' => [
'class' => ContentNegotiator::className(),
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
],
],
'verbFilter' => [
'class' => VerbFilter::className(),
'actions' => $this->verbs(),
],
'authenticator' => [
'class' => CompositeAuth::className(),
],
'rateLimiter' => [
'class' => RateLimiter::className(),
],
];
}
重点就是:ContentNegotiator::beforeAction被触发了,然后调用ContentNegotiator::negotiate这个函数来改变了Yii::$app->getResponse()的format属性