由于历史项目代码是原生写的,很多地方比较烂,考虑的不周全。于是乎,我准备把代码转移到CI框架上面来。
但问题来了,历史代码中的控制器和方法名是通过POST传递过来的。如:
$_POST['oo'] = {'module':'user', 'mothed':'index'}
我需要控制下CI,并改变路由。
上代码:
/config/hooks.php
$hook['pre_system'] = array(
'class' => 'reset_route',
'function' => 'index',
'filename' => 'reset_route.php',
'filepath' => 'hooks',
'params' => array(BASEPATH.'../com_party/libraries/', BASEPATH.'../com_party/events/')
);
/hooks/reset_route.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class reset_route {
public function index()
{
$_SERVER['REQUEST_URI'] = 'user/index';
}
}
即:
$module=$_POST['$module'];
$mothed=$_POST['mothed'];
$_SERVER['REQUEST_URI'] = $module.'/'.$mothed;
覆盖DB
$this->load->model('db_model');
$this->db = $this->db_model;
$a = $this->db->get_one();
echo $a;
CI核心类CodeIgniter-》route->URI->_parse_request_uri()
$_SERVER['REQUEST_URI']
附:
以下是一组可用的挂钩点.
- pre_system
系统执行的早期调用.仅仅在benchmark 和 hooks 类 加载完毕的时候. 没有执行路由或者其它的过程. - pre_controller
在调用你的任何控制器之前调用.此时所用的基础类,路由选择和安全性检查都已完成. - post_controller_constructor
在你的控制器实例化之后,任何方法调用之前调用. - post_controller
在你的控制器完全运行之后调用. - display_override
覆盖_display()函数, 用来在系统执行末尾向web浏览器发送最终页面.这允许你用自己的方法来显示.注意,你需要通过 $this->CI =& get_instance() 引用 CI 超级对象,然后这样的最终数据可以通过调用$this->CI->output->get_output() 来获得。 - cache_override
可以让你调用自己的函数来取代output类中的_display_cache() 函数.这可以让你使用自己的缓存显示方法 - post_system
在最终渲染的页面发送到浏览器之后,浏览器接收完最终数据的系统执行末尾调用