访问者将完美地在单个属性上完成工作,但我需要一种方法来自动为所有属性执行Accessor / Getter作业。
目的是我想在获取属性时替换一些字符/数字,然后将它们打印出来。我可以在控制器内手动完成,但我认为从模型端自动获取它会很棒。
与覆盖getAttributes()
方法一样:
public function getAttributes()
{
foreach ($this->attributes as $key => $value) {
$this->attributes[$key] = str_replace([...], [...], $value);
}
return $this->attributes;
}
但我每次都要在模型$model->getAttributes();
任何方法自动完成并干燥?
答案 0 :(得分:5)
尝试类似:
public function getAttribute($key)
{
if (array_key_exists($key, $this->attributes) || $this->hasGetMutator($key)) {
if($key === 'name') return 'modify this value';
return $this->getAttributeValue($key);
}
return $this->getRelationValue($key);
}
它完全覆盖默认方法,所以要小心一点。
修改强>
答案 1 :(得分:1)
我会采用以下方法并覆盖模型__get方法:
public function __get($key)
{
$excluded = [
// here you should add primary or foreign keys and other values,
// that should not be touched.
// $alternatively define an $included array to whitelist values
'foreignkey',
];
// if mutator is defined for an attribute it has precedence.
if(array_key_exists($key, $this->attributes)
&& ! $this->hasGetMutator($key) && ! in_array($key, $excluded)) {
return "modified string";
}
// let everything else handle the Model class itself
return parent::__get($key);
}
}
答案 2 :(得分:0)
如何使用每个创建和更新事件运行它。所以你可以这样做:
public function boot()
{
Model::creating(function ($model)
return $model->getAttributes(); //or $this->getAttributes()
});
Model::updating(function ($model)
return $model->getAttributes(); //or $this->getAttributes()
});
}