thinkphp5的_initialize() 方法的return终止问题

在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 或默认值,导致查询到了意外的数据
最终返回的是目标方法的结果,而非预期的错误信息。
如需在构造函数中终止执行可以

  1. 加异常:
if (!$this->auth->isLogin($token)) {
        // 使用框架的响应方法并终止执行
        $response = $this->error(__('Please login first'), null, '', 0, ['Content-Type' => 'application/json']);
        throw new HttpResponseException($response);
    }
    
  1. 直接输出后再exit:
$result = [
           'code' => 401,
           'msg' => '未登录',
           'data' => []
         ];
json($result)->send();exit;

如果不是ajax请求就改为echo后再exit;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值