有没有办法在修改DB_active_record.php
之外发送到数据库之前捕获所有查询并修改它们?这将是理想的,但如果它是唯一的选择,我不反对修改此文件。
我可以从模型中调用这些东西,但如果这是在后台完成的事情会感觉更好,以免留下遗忘的时间和地点;最好在后台完成它。
我正在使用库来加密查询数据。在lib中,我正在检查某些密钥是否不加密,所以这不仅仅是加密所有数据,而是每个查询中的一些数据。
例如,像这样修改insert()
:
function insert($table = '', $set = NULL)
{
if ( ! is_null($set))
{
$this->CI =& get_instance();
$this->CI->load->library('my_encrypt');
$set = $this->CI->my_encrypt->encrypt_query($set);
$this->set($set);
}
在发送到数据库之前正确加密数据。但是,这对更新/设置或解密没有任何作用。
有没有办法设置中间件或其他作为模型和活动记录之间的中介,我可以在将相关数据发送到AR或返回到模型之前加密和解密相关数据?
感谢。
所以按照下面的指南,我能够让这个工作。我正在使用pyroCMS(版本1.3.2社区; CI版本2.0.2),它已经完成了一些工作。
继承人我的所作所为。
system/cms/core/MY_Loader.php
扩展MX_loader
,扩展CI_Loader
;所以MX_Loader
是需要修改的内容。
system/cms/libraries/MX/Loader.php
将public function database()
更改为:
public function database($params = '', $return = FALSE, $active_record = NULL) {
log_message('debug', 'db loader from MX/Loader');
// Grab the super object
$CI =& get_instance();
// Do we even need to load the database class?
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db)) {
return FALSE;
}
require_once(BASEPATH.'database/DB'.EXT);
// Load the DB class
$db =& DB($params, $active_record);
//get the driver name, set its path and load er up
$my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_driver';
$my_driver_file = APPPATH.'core/'.$my_driver.EXT;
if (file_exists($my_driver_file)) {
require_once($my_driver_file);
$db = new $my_driver(get_object_vars($db));
}
if ($return === TRUE) {
return $db;
}
CI::$APP->db = DB($params, $active_record);
return CI::$APP->db;
}
与接受的答案中链接的文章的重要区别在于db vars的设置,因为pyro与常规CI不同。
然后在system/cms/core
中添加自定义驱动程序文件MY_DB_mysql_driver.php
。然后将加载这些方法,并且所有模型都可以使用这些方法。此外,此处使用与DB_active_rec.php
中相同名称的方法优先。例如在MY_DB_mysql_driver.php中添加insert
方法将覆盖DB_active_rec.php
中的插入方法。
答案 0 :(得分:3)
默认情况下,您无法扩展活动记录类。但是,您可以在扩展加载器类数据库调用之后扩展活动记录类以允许它:
说明&代码在这里:http://www.simonemms.com/code/extending-the-codeigniter-database-class/
答案 1 :(得分:1)
如果不修改核心(实际上很糟糕),则无法扩展活动记录类。所以,你有几个选择: