在CodeIgniter 2.1.0中的Hook中使用会话数据

时间:2012-03-24 08:33:33

标签: php codeigniter codeigniter-2

我正在使用版本2.1.0的CodeIgniter。我想使用Hooks进行登录验证。这意味着我希望在每个控制器中检查会话数据是否已登录。所以我想使用钩子。我这样做了以下代码:

在配置文件

$config['enable_hooks'] = TRUE;

在文件hooks.php

$hook['post_controller_constructor'][] = array(
                               'class'    => 'SessionData',
                               'function' => 'initializeData',
                               'filename' => 'loginHelper.php',
                               'filepath' => 'hooks',
                               'params'   => array()
                               );

在文件loginHelper.php

class SessionData{
    var $CI;

    function __construct(){
        $this->CI =& get_instance();
    }

    function initializeData() {

        // This function will run after the constructor for the controller is ran
        // Set any initial values here
        if (!$this->session->userdata('username')) { // This is line 13
            redirect('login');
        }
    }
}

但它会引发以下错误:

A PHP Error was encountered

Severity: Notice

Message: Undefined property: SessionData::$session

Filename: hooks/loginHelper.php

Line Number: 13

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:7)

在系统执行期间很早就调用。此时只加载了基准和钩子类......

您应该手动加载在Hook中使用的所有库和模型:

if (!isset($this->CI->session))
{
    $this->CI->load->library('session');
}

并使用$this->CI->session->userdata()代替$this->session->userdata()

答案 1 :(得分:1)

正如safarov所提到的那样,当钩子运行时,CodeIgniter系统不会加载任何库,只加载基准和钩子库。此时,您可以使用在Controller运行时加载的任何CodeIgniter功能。

因此,在您的类sessionData中,您必须使用CodeIgniter超级对象加载会话类。

class SessionData {
    var $CI;

    function __construct(){

        $this->CI =& get_instance();
        if(!isset($this->CI->session)) // Check if the session library is loaded or not
            $this->CI->load->library('session'); // If not loaded, then load it here
    }

    function initializeData() {

        // This function will run after the constructor for the controller is ran
        // Set any initial values here
        if (!$this->CI->session->userdata('username')) { // Call session methods with super object
            redirect('login');
        }
    }
}

上面的代码是您修改过的代码,我将上面提到的代码safarov放在了您的身上。

答案 2 :(得分:0)

我假设您忘记加载会话库。

答案 3 :(得分:0)

解决方案是扩展CI_Controller示例:

class SessionData extens CI_Controller {
  $this->load->library('session');
  # Code ..
}

答案 4 :(得分:0)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class sessiondata extends CI_Controller{
    function initializeData(){
        **// imports libraries.**
        $this->load->library('session');
        $this->load->helper('url');
        $this->load->helper('form');
        if(!$this->session->userdata('email')):
            redirect('login');
        endif;
    }

}

答案 5 :(得分:0)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MembersLoader
{
    function initialize() {
        $CI =& get_instance();

        // Load Session
        $CI->load->library('session');
        $member_id = $CI->session->userdata('userid');

        // Load Members Stuff
        $CI->load->library("members");
        $CI->members->set_members_data($member_id);
    }
}
  1. 您必须使用get_instance才能访问会话库

  2. 将成员会话ID保存在$ member_id

  3. 加载成员库

  4. 在成员库

  5. 的方法中使用$ member_id