Допустим, Post, Comment и Page уже умеют отправлять записи в архив. Сначала требование звучало просто: записать
текущее время в archived_at. Поэтому одинаковые методы появились прямо в моделях:
class Post extends Model
{
public function archive(): void
{
$this->archived_at = now();
$this->save();
}
public function isArchived(): bool
{
return $this->archived_at !== null;
}
}
class Comment extends Model
{
public function archive(): void
{
$this->archived_at = now();
$this->save();
}
public function isArchived(): bool
{
return $this->archived_at !== null;
}
}
А затем появляется новое правило: запись нужно уметь возвращать из архива. Теперь придётся добавить unarchive() во все
модели и не забыть про Page. Следующее изменение — например, выборка только архивных записей — снова потребует той же
работы.
Проблема не в количестве строк, а в количестве мест, где определяется одно правило. Пока реализаций несколько, они неизбежно начинают расходиться.
Общий родительский класс здесь тоже не подходит. PHP-класс может наследоваться только от одного класса, а модели уже
наследуются от Eloquent Model. Кроме того, Post и Comment остаются разными моделями. Нам нужно один раз написать
общие методы архивации, а не строить новую иерархию классов.