codeigniter - пирокмы перехватывают и модифицируют все запросы;расширение активной записи - PullRequest
3 голосов
/ 18 ноября 2011

Есть ли способ перехватить все запросы и изменить их перед отправкой в ​​БД, кроме изменения 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;
}

Важное отличие здесь отстатья, связанная в принятом ответе, является установкой db vars, поскольку пиро делает это не так, как обычный CI.

Затем в system/cms/core добавить настроенный файл драйвера MY_DB_mysql_driver.php.Затем он будет загружен, и эти методы будут доступны во всех моделях.Кроме того, методы, использующие то же имя, что и в DB_active_rec.php, будут иметь приоритет.Например, добавление метода insert в MY_DB_mysql_driver.php переопределит метод вставки в DB_active_rec.php.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

По умолчанию вы не можете расширять класс активной записи.Однако вы можете расширить класс активной записи после , расширив вызов базы данных класса загрузчика, чтобы разрешить это:

Инструкции и код здесь: http://www.simonemms.com/code/extending-the-codeigniter-database-class/

1 голос
/ 18 ноября 2011

Вы не можете расширить класс активных записей, не модифицировав ядро ​​(которое действительно отстой). Итак, у вас есть несколько вариантов:

  • Создайте базовую модель, которая реализует желаемую функциональность, и дополните ее различными моделями (таким образом, вы делаете это только один раз)
  • Добавить функциональность для каждой модели (не СУХОЙ)
  • Перезаписать основные файлы (не идеально) - это всего лишь несколько строк кода: http://robotslacker.com/2011/05/extending-codeigniters-active-record-class/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...