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语句。然后最好创建一个库,将所有逻辑移到那里,或者至少移到一个模型中。