我有几页需要登录,因此链接到这些页面的所有控制器都以
开头$this->checkSession();
//...rest of the code
CheckSession应该验证会话是否仍然有效,否则显示一条消息并停止执行控制器中的其余代码:
function checkSession()
{
if (!$this->session->userdata('is_logged_in'))
{
//the session has expired!
$data['main'] = 'confirmation_message';
$data['title'] = "Session expired";
$this->load->vars($data);
$this->load->view('template');
exit();
}
}
。 我期待这些指令按顺序发生,但我只得到一个空白页面。 如何确保只在加载所有视图后才执行exit()?
答案 0 :(得分:15)
在这种情况下佩德罗是正确的。如果他们没有登录,只是重定向他们,如果你可以使用Public/Admin named base controllers来阻止你在每个单独的受保护文件中执行此操作,那就更好了。
一般来说,如果使用exit(),它将停止输出库的运行。如果您只想停止当前控制器的执行但允许输出控制器,则可以使用完全相同的方式返回。
function checkSession()
{
return (bool) $this->session->userdata('is_logged_in');
}
然后简单地说:
if(!$this->checkSession())
{
//the session has expired!
$data['main'] = 'confirmation_message';
$data['title'] = "Session expired";
$this->load->vars($data);
$this->load->view('template');
return;
}
如果你真的希望应用程序的执行立即死亡以进行调试,错误报告等,那么只能使用exit()。
答案 1 :(得分:14)
在这种情况下,您不应该使用exit,如果会话无效,您应该使用示例重定向您的应用程序:
redirect('/init/login/','refresh');
答案 2 :(得分:12)
我有类似的问题。由于没有登录我想停止用户的地方。但是我想为他们提供一个链接列表,而不是简单地将它们重定向到登录页面。我正在使用CI版本1.7.2和$ this-> _output()$ this-> display-> _output()和$ this-> output-> _display()解决方案对我不起作用。然而,我使用$ this-> output-> get_output()函数来获取我的结果。
$this->load->vars($data);
$this->load->view('template');
die($this->output->get_output());
答案 3 :(得分:9)
$this->output->_display();
exit();
答案是否正确!感谢Sam Sehnert ......它隐藏在评论中,所以我想重新发帖。
答案 4 :(得分:2)
我对codeigniter的工作流程知之甚少,但在我看来,您想要重定向到登录页面而不是尝试渲染它。显然,在调用exit()
时,您提供的代码都不会将模板发送到浏览器。
答案 5 :(得分:2)
exit()在那里剪切你的脚本,从不调用控制器的实际_output()函数。您需要做的是在您的一个控制器中添加操作,例如用户登录屏幕并在那里重定向。您可以使用会话中的flashdata功能 - http://codeigniter.com/user_guide/libraries/sessions.html传递您的消息,然后在视图中捕获并显示它。
另一种不太聪明但应该工作的方法是强制调用输出函数。
function checkSession()
{
if (!$this->session->userdata('is_logged_in'))
{
//the session has expired!
$data['main'] = 'confirmation_message';
$data['title'] = "Session expired";
$this->load->vars($data);
$this->load->view('template');
$this->_output();
exit();
}
}
答案 6 :(得分:2)
实际上在最新的CI函数中手动调用输出类是
$this->display->_output();
并且不要担心 - 它处理缓存,如果你在config中设置了内容,也会正确地压缩内容
我通常使用处理登录功能的登录逻辑添加和扩展控制器,因此如果普通控制器是需要auth的控制器,则会自动调用login方法并且不显示原始内容。如果你想留在用户试图访问的页面而不重定向(然后将他发回到同一页面),这是一个很好的解决方案。
答案 7 :(得分:1)
将代码放入变量并写入。
$html = $this->load->view('template',null,true);
echo $html;
exit();