ThinikPhp 将数据库模型的增、删、改操作写入日志
生活随笔
收集整理的這篇文章主要介紹了
ThinikPhp 将数据库模型的增、删、改操作写入日志
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Thinkphp中的模型可以對數(shù)據(jù)庫字段進行驗證規(guī)則的設置和設置一些字段的默認值(比如字段為當前時間)以及在操作數(shù)據(jù)時的的一些回調(diào)方法等 基本上每一個模型都需要設置一些驗證規(guī)則和字段默認值的設置,而大部分都存在著重復的工作 特別是像需要將數(shù)據(jù)庫操作記錄到日志系統(tǒng)的,這就導致我們需要在每個模型中反復處理 針對此問題我定義一個父類模型,所以模型都繼承自此類即可解決以上兩個問題 父類就完成了以下兩件工作: 記錄增、刪、改等操作到日志系統(tǒng) 定義一些大部分數(shù)據(jù)庫都需要驗證的規(guī)則(子類可覆蓋或自定義)或者需要自動生成的字段(如每個數(shù)據(jù)庫都有一個記錄當前時間的字段create_time) <?php
/* * * 公共模型*/
namespace Common\Model;
use Think\Model;
class CommonModel extends Model {/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:22:19* @Description: 驗證字段,子類可以覆蓋或移出*/protected $_validate = array(array('code','require','{%ERROR_NOT_PAST}'),//必須array('name','require','{%ERROR_NOT_PAST}'),//必須);/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:08:38* @Description: 所有繼承的子類字段create_time自動生成當前時間*/protected $_auto = array (array ('create_time', 'mGetDate', 1, 'callback' ), // 增加的時候調(diào)用回調(diào)函數(shù));/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 15:52:40* @Description: 返回該類的自動驗證信息,用于在子類中合并該驗證信息(不能在子類中定義此$_validate屬性否則會被覆蓋,如果不需要在子類中合并則可以可忽略此方法)*/protected function get_validate(){return $this->_validate;}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:06:03* @Description: 獲取當前時間*/protected function mGetDate() {return date ( 'Y-m-d H:i:s' );}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 10:50:20* @Description: 更新成功后的回調(diào)方法*/protected function _after_update($data,$options) {//區(qū)分會員登錄和更改操作if( $options['model']=="Users"&& $data['last_login_ip']&& $data['last_login_time']&& count($data)==3){$this->after_write("login",$data,$options);}else{$this->after_write("update",$data,$options);}}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 10:50:27* @Description: 插入成功后的回調(diào)方法*/protected function _after_insert($data,$options) {$this->after_write("insert",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:56:12* @Description: 刪除成功后的回調(diào)方法*/protected function _after_delete($data,$options) {$this->after_write("delete",$data,$options);}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:03:18* @Description: 更新或插入成功后和刪除前寫入系統(tǒng)日志*/function after_write($type,$data,$options){$db_name = C('DB_PREFIX')."system_log"; //日志表//如果是系統(tǒng)日志表則不處理,防止循環(huán)調(diào)用此方法if(!$this->_is_array($data) || !$this->_is_array($options) || strcasecmp($options['table'],$db_name)==0) return ;$model = M("SystemLog"); //日志表$new_value = json_encode($data);// 去除前綴的表名$_data['log_table'] = str_replace(C('DB_PREFIX'), "",$options['table']);//更改時如果原數(shù)據(jù)未更改則不進行記錄,防止重復記錄if("update" === $type){//表主健$_data['t_id'] = $data['id'];// 主健名稱不是id// 獲取主健對應的數(shù)據(jù)if($_data['id']){$tablename = $options['table'];$_data['t_id'] = $data[M($tablename)->getPk()];}// 如果最后一條的值沒有更改則不記錄if($model->where($_data)->order("id desc")->getField("new_value")===$new_value) return;}$_data['log_type'] = $type;$_data['new_value'] = $new_value;$_data['log_user'] = $_SESSION['ADMIN_ID'];$_data['create_time'] = date('Y-m-d H:i:s');$_data['ip_address'] = get_client_ip(0,true);$_data['user_agent'] = $_SERVER['HTTP_USER_AGENT'];try {$model->add($_data);} catch (Exception $e) {\Think\Log::write('寫入系統(tǒng)日志時發(fā)生錯誤,錯誤信息:'.$e->getMessage(),'WARN');}}/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 11:04:40* @Description: 是否是數(shù)組*/function _is_array($array){return ($array && is_array($array) && count($array)>0);}
}
定義一個數(shù)據(jù)庫模型并繼承自CommonModel即可 <?php/*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 12:03:57* @Description: 基礎價格Model*/ namespace Common\Model; use Common\Model\CommonModel; class PriceModel extends CommonModel { /*** @Author: HTL* @Email: Huangyuan413026@163.com* @DateTime: 2016-04-08 15:01:46* @Description: 自動驗證,合并父類驗證規(guī)則*/function _initialize() {//自定義驗證規(guī)則$_val = array(array('cost','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),array('price','/^[-0-9]{1,}$/','{%ERROR_ONLY_INTEGER}'),);//合并父類的規(guī)則//驗證父類code、name字段//當前模型的create_time字段自動填充$this->_validate = array_merge (parent::get_validate(),$_val);// 移出父類的Code唯一性驗證//foreach ($this->_validate as $key => $value) {// if($value[0]=='code' && $value[4]=='unique'){// unset($this->_validate[$key]);// }//}//覆蓋父類驗證規(guī)則$this->_validate = $_val;} }
數(shù)據(jù)庫結(jié)構 CREATE TABLE `tp_system_log` (`id` INT(11) NOT NULL AUTO_INCREMENT,`log_type` VARCHAR(50) NOT NULL COMMENT '操作類別',`log_table` VARCHAR(100) NOT NULL COMMENT '操作的表',`log_user` VARCHAR(100) NOT NULL COMMENT '操作的用戶',`t_id` VARCHAR(50) NOT NULL COMMENT '操作的表的主健ID',`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作的時間',`new_value` TEXT NOT NULL COMMENT '操作后的新值',`ip_address` VARCHAR(20) NOT NULL COMMENT 'Ip地址',`user_agent` VARCHAR(500) NULL DEFAULT NULL COMMENT 'User-Agent:',PRIMARY KEY (`id`),INDEX `id` (`id`) )
參考: TP3.2開發(fā)手冊 自動驗證
TP3.1開發(fā)手冊 模型擴展
總結(jié)
以上是生活随笔為你收集整理的ThinikPhp 将数据库模型的增、删、改操作写入日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LA3971 组装电脑
- 下一篇: Queue 队列的用法