【问题标题】:Creating a filter from parent class?从父类创建过滤器?
【发布时间】:2012-05-27 09:53:26
【问题描述】:

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

有人知道吗?因为我真的很讨厌开始将这段 sn-p 代码放在其他每个类中,而且我稍后会需要过滤来做一些更复杂的事情......

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我没有尝试过,但我在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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-10
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多