我开发系统,其中钱是基本的东西,现在显示我在模型中使用访问器的任何价格:
public function getFormattedPriceAttribute()
{
return '$' . number_format($this->attributes['price'], 2); // TODO: implement currencies
}
但很快我将开始实施多种货币,我想让价格显示为定义:
protected $casts = [
'price' => 'currency',
];
对于货币的自定义转换会将其格式化为配置中的设置。
这可能与手鼓一起跳舞吗?
答案 0 :(得分:2)
扩展我的评论:
<强>冷强>
我会创建一个Currency类,如下所示:
class Currency {
$value;
public function __construct($value)
{
$this->value = $value;
}
public function formatted()
{
return '$' . number_format($this->value, 2);
}
// more methods
}
然后覆盖Model
castAttribute
方法,以包含新的可投射类:
protected function castAttribute($key, $value)
{
if (is_null($value)) {
return $value;
}
switch ($this->getCastType($key)) {
case 'int':
case 'integer':
return (int) $value;
case 'real':
case 'float':
case 'double':
return (float) $value;
case 'string':
return (string) $value;
case 'bool':
case 'boolean':
return (bool) $value;
case 'object':
return $this->fromJson($value, true);
case 'array':
case 'json':
return $this->fromJson($value);
case 'collection':
return new BaseCollection($this->fromJson($value));
case 'date':
case 'datetime':
return $this->asDateTime($value);
case 'timestamp':
return $this->asTimeStamp($value);
case 'currency': // Look here
return Currency($value);
default:
return $value;
}
}
<强>简单强>
当然,您可以使事情变得更简单,只需在castAttribute
方法中执行此操作:
// ...
case 'dollar':
return '$' . number_format($value, 2);
// ...