PHP / codeigniter - 使用exit()

时间:2010-04-11 22:46:53

标签: php codeigniter

我有几页需要登录,因此链接到这些页面的所有控制器都以

开头
$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()?

8 个答案:

答案 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();