我使用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中的设置方式。
有什么想法吗?
答案 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);
}
}