在TP5中,控制器的 _initialize() 方法是一个初始化方法,它的返回值并不会直接成为HTTP响应。即使你在 _initialize() 中使用 return,框架仍然会继续执行目标操作方法。
if (!$this->auth->isLogin($token)) {
var_dump(['code' => 401, 'msg' => '未登录']);//exit;
return json(['code' => 401, 'msg' => '未登录']);exit;
}
以上代码是在_initialize()中的,var_dump会正常执行,return只是返回数据,不影响后续执行,return后的exit不会执行。
问题的根本原因是:
当你使用 return 时,只是从 _initialize() 方法返回,但并未阻止框架继续执行目标操作方法
目标操作方法(如 getUserInfo)继续执行,并试图访问 this−>auth−>id由于未登录,this->auth->id
由于未登录,this−>auth−>id由于未登录,this->auth->id 可能为 null 或默认值,导致查询到了意外的数据
最终返回的是目标方法的结果,而非预期的错误信息。
如需在构造函数中终止执行可以
- 加异常:
if (!$this->auth->isLogin($token)) {
// 使用框架的响应方法并终止执行
$response = $this->error(__('Please login first'), null, '', 0, ['Content-Type' => 'application/json']);
throw new HttpResponseException($response);
}
- 直接输出后再exit:
$result = [
'code' => 401,
'msg' => '未登录',
'data' => []
];
json($result)->send();exit;
如果不是ajax请求就改为echo后再exit;
2349

被折叠的 条评论
为什么被折叠?



