CodeIgniter中addNew()无法获取auth()更新的$jwtoken变量值怎么办
问题解决方法
根因定位
你提供的示例代码本身的类属性赋值逻辑在同一请求生命周期内是完全可用的,不会出现$jwtoken为null的问题,出现该报错一般是以下两种场景导致:
- 场景1:同一请求内调用
addNew(),auth()方法存在提前返回/终止逻辑,没有走到给$this->jwtoken赋值的代码行 - 场景2:跨请求调用(先请求auth接口生成token,再请求addNew接口),CI控制器的类属性只在当前请求的实例内有效,两次请求会初始化不同的控制器实例,前一次请求的赋值不会保留到第二次请求,这是绝大多数新手会踩的坑
对应解决方案
同一请求场景修复
优先排查auth()方法的完整逻辑,确认所有分支都能走到给$this->jwtoken赋值的代码,也可以直接调整auth()方法为返回token值的写法,降低耦合度,示例代码如下:
class Employees extends CI_Controller { public function __construct() { parent::__construct(); } // auth方法直接返回生成的token public function auth() { if(/*你的判断条件*/){ return 'val1'; } return 'val2'; } public function addNew() { $jwtoken = $this->auth(); echo $jwtoken; } // .. }
跨请求场景修复
需要把生成的token做持久化存储,最常用的两种方案:
- 前端存储:
auth()接口将生成的token返回给前端,后续请求前端将token放在Authorization请求头中携带,addNew()方法直接从请求头读取即可 - 后端session存储:将token写入用户session,示例代码如下:
class Employees extends CI_Controller { public function __construct() { parent::__construct(); // 加载session库,也可以在application/config/autoload.php中全局配置自动加载 $this->load->library('session'); } public function auth() { if(/*你的判断条件*/){ $jwtoken = 'val1'; }else{ $jwtoken = 'val2'; } // 写入用户session $this->session->set_userdata('jwtoken', $jwtoken); } public function addNew() { // 直接从session读取token echo $this->session->userdata('jwtoken'); } // .. }
内容的提问来源于stack exchange,提问作者Muhammad Bilal
相关产品推荐
相关产品推荐

