TGViewer
Библиотека PHP программиста 👨🏼‍💻👩‍💻 Библиотека PHP программиста 👨🏼‍💻👩‍💻 @php_lib · 2.06K subscribers
Post #838 865
Анемичная модель vs Богатая модель

Ваши сущности, это просто "мешки для данных"?

Типичная ошибка (Anemic Domain Model):
У вас есть Entity Order, в которой только геттеры и сеттеры. А вся логика лежит в гигантском OrderService на 2000 строк.

❌ Как это выглядит (Анемия):


// Service
$order->setStatus('paid');
$order->setUpdatedAt(new DateTime());
// А вдруг забыли отправить ивент?
// А можно ли менять статус на 'paid', если сумма 0?
// Сервис должен всё помнить.
$repo->save($order);



✅ Как должно быть (Rich Model):
Переносим бизнес-логику внутрь сущности. Принцип "Tell, Don't Ask" (Говори, а не спрашивай).


class Order
{
// Свойства приватны! Извне их менять нельзя.
private string $status;
private array $items = [];

public function pay(Payment $payment): void
{
if ($this->status === 'paid') {
throw new DomainException("Order already paid");
}

if ($payment->amount < $this->getTotal()) {
throw new DomainException("Not enough money");
}

$this->status = 'paid';
$this->recordEvent(new OrderPaid($this->id));
}
}

// Service становится тонким и скучным (и это хорошо!):
$order->pay($payment);
$repo->save($order);



Суть: Сущность сама следит за своими инвариантами (правилами). Вы физически не можете перевести её в некорректное состояние. Сервисы просто дирижируют процессом, но не знают деталей бизнес-правил.

Где сейчас живет ваша логика? В сервисах или в моделях?

#ddd #architecture #oop #refactoring

📲 Мы в MAX

👉 @php_lib
  • ❤ 3
  • 👍 3
More from @php_lib
  1. Sep 24, 2026Сегодня хочу поговорить о теме, которая часто мешает PHP-разработчикам писать красивый и у…
  2. Sep 21, 2026Совет по Laravel💡 Если вы хотите автоматически удалять старые записи, используйте трейт P…
  3. Sep 16, 2026Совет по Laravel💡 Знаете ли вы .... tap() = Tweak and Return 🪄 Да, в Laravel метод tap()…
  4. Sep 9, 2026Совет по Laravel💡 Знаете ли вы... В Laravel есть метод withProgressBar(), который позволя…
  5. Sep 7, 2026💡Совет по Laravel Определение языка пользователя Laravel использует компонент HttpFoundat…
  6. Aug 31, 2026💡Знал ли вы, что… Метод Number::abbreviate в Laravel преобразует сложные числа в удобочит…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →