我在我的模型中定义的2个存取器是这样的:存取器 - 访问属性差异
public function setUrlAttribute($value) {
$this->url = $value;
$this->domain = parse_url($value, PHP_URL_HOST);
$this->fillSlug();
}
public function setTitleAttribute($value) {
$this->title = $value;
$this->fillSlug();
}
private function fillSlug() {
$this->slug = $this->createSlug($this->title) . '-' . $this->domain;
}
不过,我发现了一些奇怪的 - 其定义存取时,这样的时候我其实设置URL和标题的新值没有保存。但是(域和slug)基于相同的属性被正确保存。
例如:
$model = Model::find(1); // url = 'http://oldurl.com', title = 'old title'
$model->url = 'http://testurl.com';
$model->title = 'test title';
$model->save();
$model = Model::find(1);
现在我的属性是:
url: oldurl.com
title: old title
domain: testurl.com
slug: test-title-testurl.com
这是很奇怪的,因为塞的例子是$this->title
基础,所以该值应该是相同的,但事实并非如此。
的解决方案,使其使用工作:
public function setUrlAttribute($value) {
$this->attributes['url'] = $value;
$this->domain = parse_url($value, PHP_URL_HOST);
$this->fillSlug();
}
public function setTitleAttribute($value) {
$this->attributes['title'] = $value;
$this->fillSlug();
}
private function fillSlug() {
$this->slug = $this->createSlug($this->title) . '-' . $this->domain;
}
,无法直接访问属性,但使用$this->attributes['key_name']
现在的问题 - 为什么突变使用现场的存取器值时,必须使用$this->attributes
使用按预期工作,而其他字段即使对于更改的值也可以使用正常的属性访问?
所以在mutator中我应该使用'$ this-> attributes' - 现在已经很清楚了。但是增肌的其他领域呢?我可以使用'$ this-> property'访问其他字段,或者在右侧使用'$ this-> property'作为突变属性吗?我的意思是我的第二个解决方案 - 现在是完全安全还是'fillSlug',为了以防万一,我还应该使用'$ this-> attributes ['title']'而不是'$ this-> title'? – 2014-10-06 08:30:53
只要没有设置,您就可以使用' - > property',但是获取(当然访问器会被调用,如果有的话)。如果在'fillSlug'中引用'slug'属性,那么你可以像这样使用它,但是记住它会触发mutator,如果你定义一个'slug' attr有一天。 – 2014-10-06 09:08:35