【问题标题】:Forcing CodeIgniter to send view and stop working强制 CodeIgniter 发送视图并停止工作
【发布时间】:2013-06-20 23:01:47
【问题描述】:

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

-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');
        }
    }
}

还有我派生的管理控制器:

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。因为我在构建我的派生控制器时检查会话状态。如何防止加载第二个视图?

提前致谢..

【问题讨论】:

  • 您可能希望将用户重定向到登录页面,而不是加载视图。
  • 加载admin/loginView视图后使用exit();die();,试试看,我没有。
  • @HashemQolami 是的,我都试过了,但都不行..
  • @Jeemusu 谢谢。我完全忘记了redirect() ..

标签: php codeigniter constructor preventdefault


【解决方案1】:

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

public function checkSession() {

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

说明:如果您将第三个参数作为 TRUE 传递,它将返回该文件的内容。阅读ellislab.com了解更多信息。

【讨论】:

    【解决方案2】:

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

    我最近想让一堆控制器扩展一个父控制器类 (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 标头。

    【讨论】:

      【解决方案3】:

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

      尝试如下。

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

      【讨论】:

      • 您能否重新格式化您的答案并扩展示例?按原样理解有点困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多