我正在使用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 也不起作用。
任何人都有任何想法?因为我真的很讨厌开始把这段代码放在其他所有的类中,而且我以后需要过滤一些更精细的东西......
答案 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__);
}
}