在codeigniter中获取钩子预控制器中请求的控制器

时间:2012-12-21 04:21:29

标签: php codeigniter codeigniter-2 codeigniter-routing

我正在尝试制定一个简单的路由规则,只允许经过身份验证的用户访问某些控制器。

为了实现这一点,我想运行precontroller hook并检查用户是否使用ci session登录。但是,我必须知道用户想要访问哪个控制器。我如何在钩子函数中知道这一点?

5 个答案:

答案 0 :(得分:4)

$这 - >路由器 - > FETCH_CLASS();

扩展CI_Controller,这应该可行。

答案 1 :(得分:3)

我不认为钩子是你想要达到的目标的最佳实践

您可以尝试以下方法: 您需要创建将扩展的中间控制器,而不是将进行身份验证检查并将用户重定向到右控制器的CI_Controller

逐步阅读由jondavidjohn创建的本教程

http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth

你应该在10分钟后得到这个想法

答案 2 :(得分:0)

你不能把认证放在控制器构造函数上吗? 项目实例化时会调用它,你可以在那里进行检查。 此外,您始终可以扩展CI_Controller并将逻辑放在那里,以便您可以在那里进行检查(并按照建议使用this-> router-> fetch_class())。

答案 3 :(得分:0)

如果您不想使用扩展控制器路由,并且我可以在那里看到您的逻辑,那么您必须在此处使用本机PHP,因为pre_controller_hook中不存在CI对象。

因此,获取URI,然后解析它以找到控制器:

$uri = $_SERVER['REQUEST_URI'];
$segments = explode("/", $uri);

// if you're removing index.php from your urls, then
$controller = $segments[0];

// if you're not removing index.php
$controller = $segments[1];

答案 4 :(得分:0)

在自动加载库类中扩展CI_Controller。

这样的事情:

class MyAuthLibrary extends CI_Controller {
    var $ci;

    function __construct() {

        $this->ci = &get_instance();
        $route = $this->ci->router->fetch_class();

        if( ($route !== 'login') && !$this->ci->session->userdata('email_address') ) {
            redirect('login');
        } 
    }

}