Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…
Недавно я переработал код проекта, а затем обнаружил, что пишу тот же метод на модели eloquest, чтобы определить ассоциативные отношения класса учетной записи. Только для справки, я предпочитаю использовать геттеры и сеттеры вместо прямого доступа к магическим свойствам.
Поэтому я буду использовать почтовую модель для демонстрации. Это выглядит так:
Мы определили несколько методов, один для атрибута post, а другой для отношения ассоциации.
Теперь, когда мы добавим другую модель, связанную с учетной записью, мы добавим тот же метод ассоциации. Это отнимает много времени, и если вы хотите изменить эти методы, вам необходимо изменить их во всех моделях, имеющих взаимосвязи.
Использование черт
Определение торговли:
Торговля – это механизм повторного использования кода для PHP, такой как единый язык наследования. Чтобы уменьшить ограничения единого языка наследования, разработчики могут свободно повторно использовать методы в независимых классах в разных иерархиях. Семантика сочетания торговли и класса определяет способ уменьшить сложность и избежать типичных проблем традиционного множественного наследования и смешанного класса.
Торговля похожа на класс, но предназначена только для четкого и последовательного сочетания функций. Не может быть создан самим признаком. Он добавляет комбинацию горизонтальных функций к традиционному наследованию; то есть наследование не требуется между применяемыми классами.
Это идеальная причина для использования черт характера. Мы создаем тропу под названием hasaccounttrail, которая сохранит все методы всех отношений, принадлежащих одной учетной записи:
account()->associate($account);
return $this;
}
/**
* @return Account|null;
*/
public function getAccount()
{
return $this->getAttribute('account');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function account()
{
return $this->belongsTo(Account::class, 'account_id', 'id');
}
}Затем мы используем признак, чтобы изменить приведенный выше код модели post, чтобы он выглядел следующим образом:
getAttribute('title');
}
/**
* @param string $title
* @return $this
*/
public function setTitle(string $title)
{
$this->setAttribute('title', $title);
return $this;
}
/**
* @return string
*/
public function getPost()
{
return $this->getAttribute('post');
}
/**
* @param string $post
* @return $this
*/
public function setPost(string $post)
{
$this->setAttribute('post', $post);
return $this;
}
}резюме
Использование признаков означает написание неповторяющегося кода при определении отношений с одной и той же моделью. Это также может ускорить разработку, в зависимости от того, сколько ассоциаций содержится в приложении.