Функциональность аудита для Zend DB - PullRequest
1 голос
/ 24 февраля 2012

У меня есть требование для реализации функции ведения журнала аудита в Zend-проекте. Модели создаются с использованием Zend DB, а функция обновления выглядит следующим образом.

public function updateGroup($data,$id)
{       
    $row = $this->find($id)->current();
    // set the row data
    $row->name                  = $data['name'];
    $row->description           = $data['description'];

    $row->updatedBy         = $data['updatedBy'];
    $row->updatedOn         = date('Y-m-d H:i:s'); 

    $id = $row->save();
    return $id;
}

Мне нужно создать таблицу с информацией журнала аудита, которая включает текущий идентификатор пользователя. Я перепробовал много методов, и ничто не является хорошим решением. Какова наилучшая практика для хорошей функциональности ведения журнала аудита для Zend?

Я просто хочу регистрировать только измененные данные. и схема таблицы журнала похожа на

id, 
table, 
column,
rowId
oldvalue,
newvalue,
updatedon,
updatedbyuser 

1 Ответ

3 голосов
/ 24 февраля 2012

use Zend_Log_Writer_Db :

Zend_Log_Writer_Db записывает информацию журнала в таблицу базы данных, используя Zend_Db.Конструктор Zend_Log_Writer_Db получает экземпляр Zend_Db_Adapter, имя таблицы и сопоставление столбцов базы данных с элементами данных события

, например:

$columnMapping = array('name' => 'name', 
                       'desc' => 'desc', 
                       'updatedBy' => 'userid', 
                       'updatedOn' => 'date');
$writer = new Zend_Log_Writer_Db($db, 'auditlog_table', $columnMapping);

$logger = new Zend_Log($writer);


$logger->setEventItem('name', $data['name']);
$logger->setEventItem('desc', $data['name']);
$logger->setEventItem('updatedBy',$data['updatedBy']);
$logger->setEventItem('updatedOn',date('Y-m-d H:i:s'));

EDIT : чтобы регистрировать только измененные данные:

public function logUpdate(array $values)
{ 
    $columnMapping = array('id' => 'id', 
                           'table' => 'table', 
                           'column' => 'column',
                           'rowId' => 'rowId',
                           'oldvalue' => 'oldvalue',
                           'newvalue' => 'newvalue',
                           'updatedon' => 'updatedon',
                           'updatedbyuser' => 'updatedbyuser');

    $writer = new Zend_Log_Writer_Db($db, 'auditlog_table', $columnMapping);

    $logger = new Zend_Log($writer);


    $logger->setEventItem('id', $values['id']);
    $logger->setEventItem('table', $values['table']);
    $logger->setEventItem('column', $values['column']);
    $logger->setEventItem('rowId', $values['rowId']);
    $logger->setEventItem('oldvalue', $values['oldValue']);
    $logger->setEventItem('newValue', $values['newValue']);
    $logger->setEventItem('updatedon', $values['updatedon']);
    $logger->setEventItem('updatedbyuser', $values['updatedbyuser']);
} 

и в updateGroup:

public function updateGroup($data,$id)
{       
    $row = $this->find($id)->current();

    $values = array('table' => $this->name);
    $values = array('updatedon' => $data['updatedBy']);
    $values = array('updatedbyuser' => date('Y-m-d H:i:s'));
   //go through all data to log the modified columns
    foreach($data as $key => $value){
      //check if modified log the modification
      if($row->$key != $value){
        $values = array('column' => $key);
        $values = array('oldValue' => $row->$key);
        $values = array('newValue' => $value);
        logUpdate($values);
      }
    }

    // set the row data
    $row->name                  = $data['name'];
    $row->description           = $data['description'];

    $row->updatedBy         = $data['updatedBy'];
    $row->updatedOn         = date('Y-m-d H:i:s'); 

    $id = $row->save();


    return $id;
}

Обратите внимание, что лучше реализовать ведение журнала для всего вашего приложения и отделить ведение журнала от обновления, см. этот ответ за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...