我正在使用版本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
我该如何解决这个问题?
答案 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);
}
}
您必须使用get_instance才能访问会话库
将成员会话ID保存在$ member_id
加载成员库
在成员库