laravel-amount —— Model 中自动转换金额的 Trait
1、背景
系统中涉及到金额的字段,View 层表现的时候一般都是以元为单位使用小数形式展示,不过 Domain 层存储时从空间、性能、容错角度出发,经常以分为单位,用整型来存储。
在 Lavarel 中,可以在 Model 中添加属性方法进行转换
public function getAmountAttribute($value) { return $value / 100; } public function setAmountAttribute($value) { $this->attributes['amount'] = $value * 100; }
不过涉及金额的字段比较多时就需要定义很多相同逻辑的函数,本项目即将该逻辑抽出为 Trait,简化金额字段相关的处理。
2、原理
将转换逻辑封装在 AmountTrait 中,复写 Model 类的 getAttributeValue 及 setAttribute 方法,当访问相关字段时自动进行转换处理。
public static $amountTimes = 100; public function getAttributeValue($key) { $value = parent::getAttributeValue($key); if (in_array($key, $this->getAmountFields())) { $value = (int)($value / self::$amountTimes); } return $value; } public function setAttribute($key, $value) { if (in_array($key, $this->getAmountFields())) { $value = (int)($value * self::$amountTimes); } parent::setAttribute($key, $value); } public function getAmountFields() { return (property_exists($this, 'amountFields')) ? $this->amountFields : []; }
3、依赖
Laravel >= 5.24、安装
composer require "hao-li/laravel-amount:dev-master"
5、使用
1、在 Model 中引用 AmountTrait
use HaoLi\LaravelAmount\Traits\AmountTrait;
2、使用 AmountTrait
use AmountTrait;
3、定义金额字段(本例中为 amount)
protected $amountFields = ['amount'];
4、完成 之后读取 amount 字段时,该字段的内容会自动从数据库的分转换为元,向其赋值时反之从元转换为分。
6、Github
原文:http://www.jianshu.com/p/f6a886b421e1
2 Comments