CI钩子的简单配置
config/hooks.php
$hook["post_controller_constructor"][] = array( //挂钩点根据自己的需求写
'class' => 'CheckRelogin',
'function' => 'checkLogin',
'filename' => 'CheckRelogin.php',
'filepath' => 'hooks'
);
CI手册上的,根据自己的需要来选择挂钩点
以下是所有可用挂钩点的一份列表:
- pre_system 在系统执行的早期调用,这个时候只有 基准测试类 和 钩子类 被加载了, 还没有执行到路由或其他的流程。
- pre_controller 在你的控制器调用之前执行,所有的基础类都已加载,路由和安全检查也已经完成。
- post_controller_constructor 在你的控制器实例化之后立即执行,控制器的任何方法都还尚未调用。
- post_controller 在你的控制器完全运行结束时执行。
- display_override 覆盖 _display() 方法,该方法用于在系统执行结束时向浏览器发送最终的页面结果。 这可以让你有自己的显示页面的方法。注意你可能需要使用 $this->CI =& get_instance() 方法来获取 CI 超级对象,以及使用 $this->CI->output->get_output() 方法来 获取最终的显示数据。
- cache_override 使用你自己的方法来替代 输出类 中的 _display_cache() 方法,这让你有自己的缓存显示机制。
- post_system 在最终的页面发送到浏览器之后、在系统的最后期被调用。
在hooks文件夹下创建对应的类 CheckRelogin.php 简单实例如下:
<?php
class CheckRelogin
{
private $CI;
//判断是否登录满6小时需要重新登录
public function checkLogin()
{
$this->CI = & get_instance();
//若请求的url中的方法是MY_Controller这个基类中的 则放行
$whiteList = get_class_methods('MY_Controller');
$con = $this->CI->router->fetch_class(); //获取当前类名
$func = $this->CI->router->fetch_method(); //获取当前方法名
if (in_array($func, $whiteList)) return true;
if ($con == "Login") return true; //登录控制器
$index_func = array("reLogin","doRelogin"); //顶部的父框架
if ($con == "Defaults" && in_array($func,$index_func)) return true;
$now = time();
$login_time = get_cookie("login_time");
$diff_hours = floor(($now-$login_time)/3600);
if($diff_hours >= 6){
$this->CI->load->view("Index/doRelogin");
}
}
}
思路:登录时,把登录时间写入到cookie里面,钩子里面去取值和当前时间对比,超过则提示(post_controller_constructor此挂钩点是在所有方法执行前执行的 )
Mark it...