从父类创建过滤器?

时间:2012-05-20 18:36:33

标签: php codeigniter

我正在使用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 也不起作用。

任何人都有任何想法?因为我真的很讨厌开始把这段代码放在其他所有的类中,而且我以后需要过滤一些更精细的东西......

3 个答案:

答案 0 :(得分:0)

由于到目前为止还没有答案,也许这个建议可能有所帮助。但是,这是一种不同的方法,它使用Modular Extensions - HMVC ......

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

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

我在nettuts上有一个教程HMVC: an Introduction and Application,它显示了如何以这种方式执行CodeIgniter From Scratch: Day 6 – Login。也许这有帮助。我有一些困难,因为它有一个旧的codeigniter版本。所以也许this thread有帮助。

这不是你想要做的事情,但也许它会有所帮助!

答案 1 :(得分:0)

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

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

答案 2 :(得分: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__);
  }

}