在雄辩中覆盖mutator的值

时间:2018-04-05 21:30:00

标签: php laravel laravel-5 eloquent laravel-eloquent

给出以下代码:

class Picture {

    public function getAbsolutePathAttribute() {
        return "absolute_path"
    }
}

$picture = new Picture();
echo $picture->absolute_path; // prints "absolute_path"

$picture->absolute_path = "I will override you no matter what";
echo $picture->absolute_path; // prints "absolute_path"

是否有改写雄辩的mutator属性的方法?

我尝试了一种神奇的方法:

setAbsolutePathAttribute($value) {
    $this["attributes"] = $value;
}

然而它没有用。

1 个答案:

答案 0 :(得分:2)

所以我不建议通过覆盖mutator来解决这个问题。你可能会,但你越少接触Laravel的核心就越好。为什么?因为你永远不知道未来的Laravel代码会是什么样子。

下次进行轻微或主要的Laravel版本升级时,核心更改可能会破坏您的内部覆盖。

所以,有两种解决方法,给出一个简单的例子:

1。在数据库级别创建默认值

Laravel迁移具有默认的列修饰符,它看起来像这样:->default('something')

这样你根本不需要使用mutator来获取你正在寻找的默认值。

您可以在此处详细了解它们:https://laravel.com/docs/5.6/migrations#column-modifiers

2。让您的访问者更智能

你的例子非常简单,所以我只是使用它:

class Picture {

    public function getAbsolutePathAttribute() {
        if(is_null($this->absolute_path)) {
             return "absolute_path";
        }

        return $this->absolute_path;
     }
}

这样,只有在没有价值的情况下它才会有所作为。