Laravel 5.3自定义模型类型

时间:2017-02-06 15:54:43

标签: php laravel casting laravel-5.3

我开发系统,其中钱是基本的东西,现在显示我在模型中使用访问器的任何价格:

public function getFormattedPriceAttribute()
{
    return '$' . number_format($this->attributes['price'], 2); // TODO: implement currencies
}

但很快我将开始实施多种货币,我想让价格显示为定义:

protected $casts = [
'price' => 'currency',
];

对于货币的自定义转换会将其格式化为配置中的设置。

这可能与手鼓一起跳舞吗?

1 个答案:

答案 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);
// ...