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