最近由于人员变动,接手了一个TP5的项目,有个需求是对入库的某些字段进行脱敏处理。比如身份证、银行卡等等
简单翻阅了下源码,发现所有的写入请求都是走的model层的save方法。于是准备重写save方法。但是看到save方法的实现发现里面有trigger语句。发现TP5和大多数框架一样,已经实现了切面。
查阅官方文档,model层可用的切面如下
before_insert 新增前
after_insert 新增后
before_update 更新前
after_update 更新后
before_write 写入前(新增和更新都会调用)
after_write 写入后(新增和更新都会调用)
before_delete 删除前
after_delete 删除后
注册的回调方法支持传入一个参数,当前示例模型对象,并且before_write,before_insert,before_update,before_delete返回false会结束执行。
很明显before_write
符合我们自己的需求。实现如下
protected static function init()
{
//数据脱敏
OrderInfo::event('before_write',function($model){
if(!empty($model->IdCard) && !strpos($model->IdCard, '**'))
{
$len = strlen($model->IdCard) - 4;
$len < 4 && $len = 4;
$model->IdCard = substr($model->IdCard, 0, $len) . '****';
}
if(!empty($model->BankCardId) && !strpos($model->BankCardId, '**'))
{
$len = strlen($model->BankCardId) - 4;
$len < 4 && $len = 4;
$model->BankCardId = substr($model->BankCardId, 0, $len) . '****';
}
return true;
}
}
网友评论