无法在 CodeIgniter 构造函数中退出
Posted
技术标签:
【中文标题】无法在 CodeIgniter 构造函数中退出【英文标题】:Cannot exit in CodeIgniter constructor 【发布时间】:2012-10-27 16:56:46 【问题描述】:我基本上是在尝试会话控制。如果用户已登录,则可以继续。但是如果他没有登录,那么它会显示一个登录屏幕然后死。但是,当我在构造函数中使用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
,它不会显示。为什么我要使用die
?因为如果我不使用,它会在索引功能上移动,如果用户未登录,我不希望它执行索引功能。
这里有什么问题?我应该用什么来停止执行?
【问题讨论】:
您需要先使用 echo 或其他方式将其显示给用户。 如果将die;
替换为:echo $this->output->get_output(); exit;
会发生什么
你为什么要自己建造这个? CI 没有 Authentication Bundle 之类的吗?在任何情况下,您都不想在 User 类中进行检查,更不用说在构造函数中了。它不属于那里,而是在身份验证服务类中。
显示什么?浏览页面?还是什么?
约翰,谢谢。解决了。能否请您发布一个答案,以便我标记为正确答案?
【参考方案1】:
当您使用$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;
在任何控制器的方法中:
if($this->show_everything_else)
// ...
无论如何,此解决方案是一种快速解决方案,并且有很多更好的方法可以做到这一点,但所有这些都需要不同的方法。
【讨论】:
嗯,这是一个很好的方法,但我宁愿不要经常使用 if-else 语句。 然后最好建立一个库并将所有逻辑移到那里,或者至少是一个模型。 和dont do it in the constructor。【参考方案2】:你可以有一个方法并在构造函数中调用它:
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();
这是我发布的内容,也将会话保存在数据库中。
登录模型可以像这样原始:
类 Login_model 扩展 CI_Model
function validate()
$this->db->where('username', $this->input->post('username'));
$this->db->where('password', md5($this->input->post('password')));
$query = $this->db->get('users');
if($query->num_rows == 1)
$data = $query->row_array();
return $data;
else
return false;
【讨论】:
【参考方案3】:Controller 类将自动运行 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.....
【讨论】:
以上是关于无法在 CodeIgniter 构造函数中退出的主要内容,如果未能解决你的问题,请参考以下文章