火山弹拦截并修改所有查询;扩展活动记录


pyrocms intercept and modify all queries; extending active record

有没有办法捕获所有查询并在修改DB_active_record.php之外发送到数据库之前对其进行修改?这将是理想的,尽管如果这是唯一的选择,我不反对修改此文件。

我可以从模型中调用这些东西,但如果这是在后台完成的,这样就不会留下忘记何时何地发生的空间,我会感觉更好;最好在后台完成。

我正在使用库来加密查询数据。在库中,我正在检查某些密钥是否未加密,因此这不仅仅是加密所有数据的问题,而是加密每个查询中的一些数据的问题。

例如,修改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;
}

这里与接受答案中链接的文章的重要区别在于数据库变量的设置,因为火焰兵的做法与常规 CI 不同。

然后在system/cms/core中添加自定义驱动程序文件MY_DB_mysql_driver.php。然后,这将被加载,这些方法将在所有模型中可用。此外,此处使用与 DB_active_rec.php 中相同的名称的方法将优先。例如,在MY_DB_mysql_driver.php中添加insert方法将覆盖DB_active_rec.php中的插入方法。

默认情况下,您无法扩展活动记录类。但是,您可以在扩展加载程序类数据库调用扩展活动记录类以允许它:

说明和代码在这里: http://www.simonemms.com/code/extending-the-codeigniter-database-class/

如果不修改内核,就无法扩展活动记录类(这真的很糟糕(。因此,您有以下几种选择:

  • 创建一个实现所需功能的基本模型,并使用各种模型对其进行扩展(这样您只需要执行一次(
  • 为每个模型添加功能(非 DRY(
  • 覆盖核心文件(不理想( - 它只有几行代码:http://robotslacker.com/2011/05/extending-codeigniters-active-record-class/