0

我正在使用 CodeIgniter,我想创建某种过滤器来了解用户何时可以/不可以访问当前控制器

如果有人知道如何以不同的方式实现这一点,那很好,但我的想法(并试图做的)如下:

CI_Controller - 这是基本的 CodeIgniter 控制器类

MY_Controller - 我使用的扩展 CI_Controller 的基本控制器

[控制器] - 任何“物理”控制器

我试图做的是:

MY_Controller.php

class MY_Controller extends CI_Controller{

    private static $namespace = null;

    private static $permission = array('site', 'settings');

    public function __construct(){
        if ((!isset($_SESSION['user'])) && (in_array(__CLASS__, $permission))){
            throw new Exception('Unauthorized');
        }
        parent::__construct();
    }

}

显然,这不起作用,因为CLASS始终是 MY_Controller 的,而不是子对象的……而且NAMESPACE也不起作用。

有人有什么想法吗?因为我真的很讨厌开始把这段代码放在其他所有的类中,我稍后会需要过滤来做一些更复杂的事情......

4

3 回答 3

0

由于到目前为止还没有答案,也许这个建议可能会有所帮助。不过,这是一种不同的方法,它使用模块化扩展 - HMVC ...

像这样,您可以拥有一个带有控制器的“登录”模块,该控制器包含一些方法来登录用户、检查会话状态和注销用户(等等)。

在每个其他模块中,您现在可以加载模块登录名并检查状态并在需要时重定向...

有一个教程HMVC: an Introduction and Application I follow on nettuts 展示了如何从头开始编写 CodeIgniter:第 6 天 – 以这种方式登录。也许这有帮助。我遇到了一些困难,因为它使用的是旧的 codeigniter 版本。所以也许这个线程有帮助。

这不是您尝试做事的方式,但也许会有所帮助!

于 2012-05-20T20:05:29.910 回答
0

我没有尝试过,但我在这个论坛上看到的内容可能对你有用。预测代码为:

class MY_Controller extends Controller{
    private static $permission = array('site', 'settings');
    public function __construct(){
        if ((!isset($_SESSION['user'])) && (in_array(__CLASS__, $permission))){
            throw new Exception('Unauthorized');
        }
        parent::Controller();
    }
}

但是你需要使用

class My_controller extends MY_Controller

代替

class My_controller extends Controller
于 2012-05-20T21:09:23.847 回答
0

我通过以下方式解决了它......只是在构造函数中,我定义了当前类

class MY_Controller extends CI_Controller{
    private static $permission = array('site', 'settings');
    public function __construct($currentController = __CLASS__){
        if ((!isset($_SESSION['user'])) && (in_array($currentController , $permission))){
            throw new Exception('Unauthorized');
        }
        parent::Controller();
    }
}

在调用物理控制器的时候,我们简单的写成如下

class PhysicalController extends MY_Controller{

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

}
于 2012-05-30T13:44:37.460 回答