我在我的模型中定義的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