У меня есть в моей модели определяется по 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
работать по назначению, тогда как в другом поле может использоваться обычный атрибут, доступный даже для значений, которые были изменены?
Итак, в мутаторе я должен использовать '$ this-> attributes' - теперь это понятно. Но как насчет других полей в мутаторе? Могу ли я получить доступ к другим полям с помощью '$ this-> property' или даже использовать свойство $ this-> для мутированного атрибута, когда он находится на правой стороне? Я имею в виду мое второе решение - теперь это полностью безопасно или, возможно, для 'fillSlug', я должен использовать атрибуты $ this-> ['title']' вместо '$ this-> title' на всякий случай? –
Вы можете использовать свойство '->', если оно не установлено, но получение (конечно, аксессоры будут вызваны, если они есть). Если в 'fillSlug' вы ссылаетесь на атрибут' slug', вы можете использовать его именно так, но имейте в виду, что он вызовет мутатор, если вы определите один из них для 'slug' attr один день. –