我已经在钩子上创建了将当前访问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中,我想在调用任何控制器方法之前检查会话。
答案 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()
);
否则你也可以在这里使用原生会话
希望有所帮助