codeIgniter无法访问Hook中的会话

时间:2018-04-19 10:44:41

标签: php codeigniter session hook

我已经在钩子上创建了将当前访问URL设置为session。我必须稍后使用此URL。我使用$this->CI =& get_instance();然后$this->CI->session->userdata调用了codeIgniter的会话方法,但它正在给出

  

尝试在$this->CI->session->userdata

上获取非对象的属性

我已完成以下操作以在CI中启用挂钩

的config.php

$config['enable_hooks'] = TRUE;

hooks.php

$hook['pre_controller'] = array(
        'class'    => 'Preclass',
        'function' => 'checkreq',
        'filename' => 'preclass.php',
        'filepath' => 'hooks',
        'params'   => array()
);

preclass.php

class Preclass
{
    private $CI;
    public function __construct()
    {
        $this->CI =& get_instance();

    }
    public function checkreq($value='')
    {
        var_dump($this->CI->session->userdata);
        die;
    }
}

注意:不要将此帖子关闭为PHP重复错误。据我所知,错误。这是在CodeIgniter中,我想在调用任何控制器方法之前检查会话。

2 个答案:

答案 0 :(得分:2)

来自评论:“但我想在控制器方法调用之前甚至在构造函数之前调用它”

要解决您的问题,这是您可以做的最好的事情:

MY_Controller.php中制作application/core

class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();
        // class is just an alias for the controller name
        if (!$this->user->is_allowed($this->router->class)) {
            redirect('somepage');
        }
    }

}

然后让所有控制器扩展MY_Controller

class Somecontroller extends MY_Controller {

    public function __construct() {
        parent::__construct();
        // nothing below the above line will be reached
        // if the user isn't allowed
    }

}

您是否在课程中使用__construct()方法:只要不允许用户访问该网页,就不会发生任何事情,例如调用parent::__construct()之后什么都不会 - 甚至是方法。同样,如果控制器不存在构造函数,则隐含调用父构造函数的事实。

注意:如果您自动加载模型并在模型MY_Controller中的__construct()中执行相同的逻辑,则应获得相同的结果。我发现这种方法更清洁。

答案 1 :(得分:0)

这在Codeigniter中是不可能的,session本身就是一个库,你试图将其称为pre_controller。当控制器没有加载时,你怎么能在钩子中使用它。

解决方案

您可以使用post_controller_constructor代替现在正在使用的内容

$hook['post_controller_constructor'] = array(
        'class'    => 'Preclass',
        'function' => 'checkreq',
        'filename' => 'preclass.php',
        'filepath' => 'hooks',
        'params'   => array()
);

否则你也可以在这里使用原生会话

希望有所帮助