最近由于人員變動,接手了一個TP5的項目,有個需求是對入庫的某些字段進行脫敏處理。比如身份證、銀行卡等等
簡單翻閱了下源碼,發(fā)現(xiàn)所有的寫入請求都是走的model層的save方法。于是準備重寫save方法。但是看到save方法的實現(xiàn)發(fā)現(xiàn)里面有trigger語句。發(fā)現(xiàn)TP5和大多數(shù)框架一樣,已經(jīng)實現(xiàn)了切面。
查閱官方文檔,model層可用的切面如下
before_insert 新增前
after_insert 新增后
before_update 更新前
after_update 更新后
before_write 寫入前(新增和更新都會調(diào)用)
after_write 寫入后(新增和更新都會調(diào)用)
before_delete 刪除前
after_delete 刪除后
注冊的回調(diào)方法支持傳入一個參數(shù),當前示例模型對象,并且before_write,before_insert,before_update,before_delete返回false會結束執(zhí)行。
很明顯before_write符合我們自己的需求。實現(xiàn)如下
protected static function init()
{
//數(shù)據(jù)脫敏
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;
}
}