关于Yii2的异常(errorHandle)的问题

一个没有认证的API应用

首先, Controller基类behaviors方法是默认, 只继承了\yii\rest\Controller, 没有额外添加认证, 然后自定义了site/error

public function actionError()
{
    /** @var \Exception $exception */
    $exception = Yii::$app->errorHandler->exception;

    if ($exception !== null)
    {
        $this->setBody($exception->statusCode ?? $exception->getCode(), $exception->getMessage());

        return [];
    }

此时在自定义方法中throw异常,根据这个问题(yii2 关于自定义errorHandler的疑问)可知由于API接口为json响应格式,不会走向site/error那么问题是

如果此时访问一个不存在的方法, 比如/site/sdfjjsfk, 此时为404NotFound, 但却走向了site/error, 返回值与上述直接throw new NotFoundHttpException('')是不一样的, 这是为什么呢?

// 自定义
{"code":404,"msg":"Page not found.","data":[]}
// throw new NotFoundHttpException
{"name":"Not Found","message":"","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException"}

一个带有认证的API应用

Controller基类同样继承 \yii\rest\Controller, behaviors方法加入认证

$behaviors['authenticator'] = [
    'class' => CompositeAuth::class,
    'authMethods' => [
        [
            'class' => TokenAuth::class,
        ],
    ],
    'except' => $this->except,
    'only' => $this->only,
];

自定义方法TokenAuth继承\yii\filters\auth\HttpBasicAuth并重写authenticate方法

class TokenAuth extends \yii\filters\auth\HttpBasicAuth
{
    public function authenticate($user, $request, $response)
    {
        ...
        
        if(...)
        {
            throw new BadRequestHttpException('使用非法客户端');
        }
        
        ...
    }
}

问题是:
在该方法中抛出异常得不到正确的响应, 比如上述应是400, 实际却是500,而在其他behaviors中表现正常, 比如Verbfilter使用不正确的HTTP动词会得到正确的异常返回值,那么这种错误能有哪些可能性

阅读 4.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题