【问题标题】:Reusing an accessors & mutators重用访问器和修改器
【发布时间】:2016-06-09 12:12:52
【问题描述】:

在我的几个模型中,我有这样的代码

public function setTotalAttribute($value)
{
    return $this->attributes['total'] = $value * 100;
}

public function getTotalAttribute($value)
{
    return $value * 0.01;
}

有时我要更改的字段称为购买或价格,但代码是相同的(将 7.99 更改为 799 以存储在数据库中,并在返回时将其更改回来)。

如果所有字段的名称都相同,我可以使用一个特征,但是它们略有不同....有没有一种方法可以设置类似于自动变异为 Carbon 实例的日期字段的内容?

【问题讨论】:

  • 您可以使用traits (PHP >= 5.5)。或者abstract 类。
  • @DanFromGermany 我提到我不能使用特征,因为不同模型的字段名称不同..除非我遗漏了什么..

标签: laravel laravel-5 accessor mutators


【解决方案1】:

一种解决方案是在具有此类字段的模型中定义处理美元/美分转换的字段,然后使用 trait 覆盖全局修改器/访问器。

class Model
{
    use HasMoneyFields;

    protected $moneyFields = ['purchase', 'price', 'total'];
}

trait HasMoneyFields
{        
    public function getAttributeValue($key)
    {
        $value = parent::getAttributeValue($key);

        if (property_exists($this, 'moneyFields')) {
             if (in_array($key, $this->moneyFields)) {
                 $value /= 100;
             }
        }

        return $value;
    }

    public function setAttribute($key, $value)
    {
        parent::setAttribute($key, $value);

        if (property_exists($this, 'moneyFields')) {
             if (in_array($key, $this->moneyFields)) {
                 $this->attributes[$key] = $value * 100;
             }
        }
    }
}

【讨论】:

  • 这看起来很有希望!请注意,我使用 $value * 0.01 而不是除法,因此我不必检查 0(除以零)并处理它。谢谢!
  • 一个缺点是,魔术调用很昂贵,PHP 无法优化代码并且会比正确的方法定义慢。
  • 另一个缺点是你只能这样做一次。为 Money 执行此操作,然后为其他内容执行此操作将失败,因为无法在同时使用的两个不同特征中使用相同的函数名称。
【解决方案2】:

你可能对https://github.com/topclaudy/eloquent-mutators感兴趣

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use \Awobaz\Mutator\Mutable;

    protected $accessors = [
        'title'   => 'trim_whitespace',
        'content' => 'trim_whitespace',
    ];
}

该包允许您创建自定义访问器/修改器扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多