如何基于Laravel模型number字段自动生成hashed_number并移除该填充项
可以通过修改器实现需求,具体调整如下:
1. 更新模型的$fillable
先移除$fillable中的hashed_number,确保该字段不会通过批量赋值被手动设置:
protected $fillable = [ 'number', 'security_code' ];
2. 修改number字段的修改器逻辑
在number的Attribute设置方法中,利用原始未加密的卡号自动生成hashed_number并写入模型属性,无需单独传入该参数:
protected function number(): Attribute { return Attribute::make( get: fn(string $value) => Crypt::decrypt($value), set: function(string $value) { // 基于原始卡号生成hashed_number $this->attributes['hashed_number'] = hash('sha3-512', $value) . Config::get("app.card_pepper"); // 返回加密后的卡号用于数据库存储 return Crypt::encrypt($value); } )->shouldCache(); }
3. (可选)简化hashedNumber修改器
由于已经手动完成hashed_number的赋值,原来的hashedNumber修改器可以保留只读逻辑(如果需要从模型直接获取该值),或者直接删除:
// 保留只读的hashedNumber修改器(可选) protected function hashedNumber(): Attribute { return Attribute::make( get: fn(string $value) => $value )->shouldCache(); }
逻辑说明
当创建或更新GiftCard模型时,只要传入number参数,number的set方法会先基于原始卡号生成hashed_number并写入模型属性数组,再返回加密后的卡号存入数据库。整个过程完全自动,无需手动处理hashed_number字段。
内容的提问来源于stack exchange,提问作者Damian Rafael Lattenero
相关产品推荐
相关产品推荐

