使用Ion Auth logout()方法后,无法显示flashdata

时间:2017-02-08 22:04:09

标签: codeigniter ion-auth

我使用Ion Auth和CodeIgniter,并且无法弄清楚如何在使用注销方法后显示会话数据。

我有一个这样的退出方法:

public function logout() {

    $this->ion_auth->logout();
    $this->session->set_flashdata('msg', '<div class="has-success"><span class="help-block">Your password has been successfully changed. Please login to continue!</span></div>');
    redirect('users/login');

}

调用它的方法是更改​​密码方法,我这样称呼它:

if ($this->ion_auth->change_password($identity, $this->input->post('old_password'), $this->input->post('password'))) {
    $this->logout();
} else {
    $this->session->set_flashdata('msg', '<div class="has-error"><span class="help-block">'.$this->ion_auth->errors().'</span></div><div class="has-error"><span class="help-blocK"></span></div>');
    redirect('users/change_password');
}

我也在登录页面的视图中正常回显:

<?php echo $this->session->flashdata('msg'); ?>

一旦删除$this->ion_auth->logout()方法,一切正常。

我知道logout()方法会破坏会话,这就是我之后设置flashdata的原因,但是当我重定向到登录页面时,我仍然没有收到消息。看起来这就是它在github repo中的设置方式。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在销毁会话后,Sever不会创建会话,直到向服务器发出新请求为止。只需在控制器中创建另一个函数,并在注销后重定向到该函数并在该函数中设置flashdata并将其重定向到您想要的位置。

示例:

public function logout() {
    if ($this->ion_auth->logged_in()) {
        $this->ion_auth->logout();
        redirect(base_url() . 'front/logout_message', 'refresh');
    }
    redirect(base_url(), 'refresh');
}

public function logout_message() {
    $this->session->set_flashdata('message', 'Successfully! Logged Out!');
    redirect(base_url(), 'refresh');
}

答案 1 :(得分:0)

这是因为注销会破坏会话,并且在使用CI处理会话的方式进行下一次刷新之前,不会准备好使用新会话。

要注意的代码在https://github.com/benedmunds/CodeIgniter-Ion-Auth/blob/2/libraries/Ion_auth.php#L417

答案 2 :(得分:0)

您可以使用unset_userdata来保留您的Flash数据。

使用以下此功能注销并保留flashdata:

 function logout_with_flashdata(){
    $ci =& get_instance();
    foreach($ci->session->userdata as $k => $v){
      if($k == 'message' || $k == '__ci_vars'){
        continue;
      }
      $ci->session->unset_userdata($k);
    }
  }