强制CodeIgniter发送视图并停止工作


Forcing CodeIgniter to send view and stop working

你好,我使用继承控制器。这些是我的控制器:

-baseAdminController:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');
class _BaseAdminController extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->library('session');
        $calledFunction= $this->router->fetch_method();
        if ($calledFunction!= 'loginView' && $calledFunction!= 'doLogin') {
            $this->checkSession();
        }
    }
    public function checkSession() {
        if ($this->session->userdata('loggedIn') == false) {
            $this->load->view('admin/loginView');
        }
    }
}

和我的派生Admin Controllers:

if (!defined('BASEPATH'))
    exit('No direct script access allowed');
class AdminController extends _BaseAdminController {
    public function indexView() {
        $this->load->view('admin/indexView');
    }
}

当我试图登录时,CodeIgniter向我显示admin/loginView和admin/indexView。因为我在构造派生控制器时检查会话状态。如何防止加载第二视图?

要回答您的问题,您可以在checkSession方法中执行以下操作:

public function checkSession() {
    if ($this->session->userdata('loggedIn') == false) {
        echo $this->load->view('admin/loginView', array(), TRUE);
        exit;
    }
}

解释:如果你传递第三个参数为TRUE,它将返回该文件的内容。阅读ellislab.com获取更多信息

我希望这与你的问题有关:

我最近想有一堆控制器扩展父控制器类(MY_Acl_Controller),检查当前登录的用户应该访问每个方法(使用一个自成的ACL库)。检查将在MY_Acl_Controller的构造函数中启动,因此它将在每个请求上运行。

我想将Output类的输出设置为加载视图的结果,然后显示视图并退出,但是因为这个过程不是在路由控制器方法中执行的,所以我不能只是调用$this->load->view('errors/access_denied')然后从构造函数返回…CI将继续执行控制器代码。

所以我创建了一个MY_Output类,扩展了CI_Output,并在其中添加了一个公共函数display_with_exit():

public function display_with_exit()
{
    $this->_display($this->final_output);
    exit;
}
然后,在MY_Acl_Controller的构造函数中:
...
if(!$user_deserves_access)
{
    $this->load->view('errors/access_denied');
    $this->output->display_with_exit();
}

也许这对某人有用?

这种方法的优点是Output类的_display()函数发送您想要的所有HTTP头,就像任何正常的响应一样。

避免exit;/function exit;die;会终止执行,最好只调试你的代码。

尝试如下。

public function index(){
  if($xx) return TRUE;
}