身份验证组件仍在获取会话的旧值


The Auth component still fetching older value of Session?

我正在通过以下代码手动修改AppController.php的beforeFilter中Auth会话的一些密钥

public function beforeFilter(Event $event){
    //$companyId = $this->Companies->find(.........
    $this->request->session()->write('Auth.User.company_id', $companyId);
}

在不同控制器的各种操作中,我试图通过以下方式在会话中获取存储的公司ID

public function add(){
    $companyId = $this->Auth->user('company_id');
    debug($companyId); die;
}

当我看到$companyId的值时,它显示的是AppController的beforeFilter方法中未更新的旧值。但是,如果我刷新页面并且不再修改会话,我将获得更新的$companyId值。

所以我的问题是,我如何更新Auth会话数据的值,以便在同一请求的不同位置使用$this->Auth->user('company_id')代码获得更新的值?

身份验证组件使用的会话存储使用缓冲机制,即会话中的值通常每个请求只读取一次(除非正在删除/清空)。

https://github.com/cakephp/cakephp/blob/3.2.8/src/Auth/Storage/SessionStorage.php#L81-L83

因此,在控制器操作中直接从会话中读取值,或者不直接写入会话,而是写入会话存储,类似

$user = $this->Auth->user();
if (is_array($user) && $user) {
    $user['company_id'] = $companyId;
    $this->Auth->setUser($user);
}