Php 无法在CodeIgniter构造函数中退出

Php 无法在CodeIgniter构造函数中退出,php,codeigniter,exit-code,Php,Codeigniter,Exit Code,我基本上是在尝试会话控制。如果用户已登录,则可以继续。但如果他没有登录,那么它将显示一个登录屏幕,然后消失。但是,当我在构造函数中使用die或exit时,它不会显示登录屏幕;它马上就死了。代码如下: private $username = null; private $mongoid = null; private $neoid = null; public function __construct(){ parent::__construct(); // session t

我基本上是在尝试会话控制。如果用户已登录,则可以继续。但如果他没有登录,那么它将显示一个登录屏幕,然后消失。但是,当我在构造函数中使用
die
exit
时,它不会显示登录屏幕;它马上就死了。代码如下:

private $username = null;
private $mongoid = null;
private $neoid = null;

public function __construct(){
    parent::__construct();

    // session to global
    $this->username = $this->session->userdata( 'username');
    $this->mongoid = $this->session->userdata( 'mongoid');
    $this->neoid = $this->session->userdata( 'neoid');

    // check if user is logged in
    if( $this->username == "" || empty( $this->username)){
        $this->load->view( 'access/login');
        die;
    }
}
如果没有写入
die
,但使用
die
,则会显示登录页面。为什么我要使用
模具
?因为如果我不使用,它会在索引函数上移动,如果用户未登录,我不希望它执行索引函数


这里怎么了?我应该使用什么来停止执行?

当使用
$this->load->view()加载视图时,CodeIgniter不会立即输出视图,它将视图的输出放在输出缓冲区中,并在加载所有内容后将整个输出刷新给用户。话虽如此,您看到的问题是,它缓冲了输出,然后没有刷新它就死掉了

die
非常糟糕,不应该在调试之外使用,最好使用变量开关之类的东西。如果它仅适用于控制器范围,那么您可以

private $show_everything_else = true;
在构造函数中:

if( $this->username == "" || empty( $this->username)){
    $this->load->view( 'access/login');
    $this->show_everything_else = false;
}
function __construct() {
    parent::__construct();
    $this->_is_logged_in();
}
在控制器的任何方法中:

if($this->show_everything_else) {
    // ...
}

在任何情况下,此解决方案都是一个快速解决方案,并且有更好的可能性来实现这一点,但所有这些都需要不同的方法。

您可以拥有一个方法并在构造函数中调用它:

if( $this->username == "" || empty( $this->username)){
    $this->load->view( 'access/login');
    $this->show_everything_else = false;
}
function __construct() {
    parent::__construct();
    $this->_is_logged_in();
}
方法应该如下所示:

function _is_logged_in() {
    $is_logged_in = $this->session->userdata('is_logged_in');
    if (!isset($is_logged_in) || $is_logged_in != true) {
        redirect('login');
        die();
    }
}
<?php

class Login extends CI_Controller {

    function index() {
        $this->load->view('LOGIN-VIEW');
    }

    function validate() {
        $this->load->model('login_model');
        $data = $this->login_model->validate();

        if ($data != false) {
            $data['is_logged_in'] = true;
            $this->session->set_userdata($data);
            redirect('MAIN-CONTROLLER-AFTER-LOGIN');
        }
        else {
            $this->index();
        }
    }

    function logout() {
        $this->session->sess_destroy();
        $this->index();
    }

}
当然,您应该有用于登录的控制器,它可以如下所示:

function _is_logged_in() {
    $is_logged_in = $this->session->userdata('is_logged_in');
    if (!isset($is_logged_in) || $is_logged_in != true) {
        redirect('login');
        die();
    }
}
<?php

class Login extends CI_Controller {

    function index() {
        $this->load->view('LOGIN-VIEW');
    }

    function validate() {
        $this->load->model('login_model');
        $data = $this->login_model->validate();

        if ($data != false) {
            $data['is_logged_in'] = true;
            $this->session->set_userdata($data);
            redirect('MAIN-CONTROLLER-AFTER-LOGIN');
        }
        else {
            $this->index();
        }
    }

    function logout() {
        $this->session->sess_destroy();
        $this->index();
    }

}

控制器类将自动运行index()函数。因此,如果登录签入构造失败,则必须返回index()。以下是您可以做的:

private $username = null;
private $mongoid = null;
private $neoid = null;
private $no_login = false;

public function __construct(){
    parent::__construct();

    // session to global
    $this->username = $this->session->userdata( 'username');
    $this->mongoid = $this->session->userdata( 'mongoid');
    $this->neoid = $this->session->userdata( 'neoid');

    // check if user is logged in
    if( $this->username == "" || empty( $this->username)){
        $this->load->view( 'access/login');
        $this->no_login = true;
    }
}

function index(){
    if($this->no_login) return;
    // another statement if login success.....
}

您需要先使用echo或其他东西向用户显示它使用:
echo$this->output->get_output();退出你为什么自己构建这个?CI没有身份验证包或其他东西吗?在任何情况下,您都不希望在用户类中进行该检查,更不用说在构造函数中了。它不属于那里,但属于身份验证服务类。显示什么?查看页面?还是什么?约翰,谢谢你。问题解决了。你能给我一个答案吗,这样我就可以标记为正确答案了?好吧,这是一个很好的方法,但我不想经常使用if-else语句。然后最好创建一个库,将所有逻辑移到那里,或者至少移到一个模型中。