Я был очень занят, пытаясь понять понятия слоя ddd и Model в последнее время. Читайте тонны статей, примеры, Q и A, потратили на это много часов. И все же я не уверен, правильно ли я получил некоторые принципы.DDD, PHP. Объект домена и бизнес-логика
Один из них - ответ на вопрос: сколько бизнес-логики должно существовать в объектах Domain? Некоторые источники говорят, что объекты домена должны быть привязаны ко всей бизнес-логике, с другой стороны, я столкнулся с статьями, где, как я предполагал, он должен быть как можно более крошечным и представлять только его значения. Это меня смущает.
В моем понимании объекты домена являются классами, которые представляют собой сущности в домене.
Итак, давайте, например, перейдем к объекту-фактуре. Каждый счет-фактура состоит из его элементов. Для расчета стоимости счета-фактуры, мы должны суммировать все значения предметов (это очень простой пример, в реальном мире был бы случаи, такими как добавление налога, вычислительным оплачиваемой стоимость и т.д.)
class Invoice
{
public $id;
public $items = [];
public $status;
const STATUS_PAID = 'paid';
const STATUS_NOT_PAID = 'not_paid';
public function isPaid()
{
return $this->status == self::STATUS_PAID;
}
public function getInvoiceValue()
{
$sum = 0;
foreach($this->items as $item) {
$sum += $item->value;
}
return $sum;
}
}
В моем понимании, метод isPaid() находится в нужном месте. Это относится к его собственным данным. Но я не уверен в getInvoiceValue(). Мы работаем здесь на других объектах домена.
Возможно, нам нужно использовать объекты домена только для представления данных, но использовать некоторые декораторы для выполнения более сложных задач?
Заранее благодарен.
Благодарим вас за полезный ответ. Итак - давайте подтвердим правильность моего понимания. В нашем случае счет-фактура является совокупностью. Агрегатный корень - это сам Счет-фактура, но это тоже Сущность, правильно? Он имеет свою собственную идентификацию (номер счета-фактуры, который является уникальным). Что такое InvoiceItems? Могу ли я получить их непосредственно из репозитория InvoiceItem (если я должен его создать), или мне всегда приходится работать только на Aggregate? – hopsey
обновил мой ответ – tomliversidge