DDD у Laravel на реальному проєкті

Практична серія про Domain-Driven Design у Laravel: межі домену, агрегати, бізнес-правила, сервіси, транзакції, події та моделі читання на прикладах із реального проєкту.

DDD у Laravel на реальному проєкті
ddd-in-practice-when-crud-stops-being-enough-cover.png
Ларавель

DDD на практиці: коли звичайний CRUD перестає бути достатнім

CRUD чудово працює, поки сутність справді проста. Але коли з’являються стани, дозволені переходи, залежності та правила, контролер починає знати занадто багато. На простих прикладах показую, коли модель предметної області стає кориснішою за набір create/update/delete.

100
how-i-find-domain-boundaries-while-the-system-is-still-growing-cover.png
Ларавель

Як я визначаю межу домену, коли система ще росте

Межі предметної області рідко видно ідеально на початку. На практиці я дивлюся на мову, правила, причини змін і життєвий цикл. Якщо дві частини системи змінюються з різних причин, це сильний сигнал, що їх не варто тримати в одному контексті.

108
where-should-a-business-rule-live-controller-service-or-domain-model-cover.png
Ларавель

Де має жити бізнес-правило: у контролері, сервісі чи моделі предметної області?

Спочатку бізнес-правило легко залишити в контролері або прикладному сервісі. Але коли воно використовується з кількох сценаріїв, стає видно, що це вже правило предметної області. На простих прикладах показую, як я розділяю перевірку запиту, координацію сценарію і доменний інваріант.

92
application-service-vs-domain-service-how-i-separate-their-responsibilities-cover.png
Ларавель

Application Service і Domain Service: як я перестала плутати їхню відповідальність

Мені довго було легко назвати будь-яку складнішу логіку сервісом. На практиці допомогло просте розділення: прикладний сервіс координує сценарій, транзакцію, сховище та зовнішні залежності, а доменний сервіс виражає правило предметної області, яке природно не належить одному об’єкту.

128
ddd-in-practice-avn-center-boundaries-aggregate-roots-consistency-cover.png
Ларавель

DDD на практиці в AVN Center: межі моделі, агрегати та узгодженість

На прикладі ProductRegistry показую кілька практичних рішень DDD: як розділяю відповідальність між шарами, чому ProductRegistration і BootstrapInvitation залишаються окремими агрегатами, коли доречні події та коли потрібна сильна узгодженість.

130
domain-event-or-direct-method-call-how-i-choose-between-them-cover.png
Ларавель

Domain Event чи звичайний виклик методу: як я обираю між ними

Я не використовую доменні події всюди. Якщо друга дія є обов’язковою частиною інваріанта, залишаю її в прямому виклику й одній транзакції. Якщо інша частина системи лише реагує на вже збережений факт, доменна подія часто підходить краще.

81
ddd-read-models-why-reads-do-not-always-need-the-domain-model-cover.png
Ларавель

Read Model у DDD: чому для читання не завжди потрібна доменна модель

Модель предметної області потрібна насамперед для захисту правил під час зміни стану. Для списку, таблиці або відповіді API часто потрібна інша форма даних. Пояснюю, чому окрема модель читання не порушує DDD, а часто робить код простішим.

96
value-objects-in-a-real-project-when-a-primitive-string-is-no-longer-enough-cover.png
Ларавель

Value Object у реальному проєкті: коли primitive string уже недостатньо

Рядок достатній, поки значення не має власних правил. Коли разом із ним з’являються нормалізація, перевірка, порівняння або окрема семантика, Value Object допомагає зробити ці правила явними й не розкидати їх по сервісах.

62
ddd-does-not-start-with-folders-project-structure-alone-is-not-domain-driven-design-cover.png
Ларавель

DDD не починається з папок: чому структура директорій ще не робить проєкт domain-driven

Папки Domain, Application та Infrastructure можуть допомогти організувати код, але самі по собі не створюють DDD. Якщо бізнес-правила досі живуть у контролерах і загальних сервісах, змінилася лише структура директорій.

80
when-a-repository-actually-makes-sense-in-laravel-ddd-cover.png
Ларавель

Коли Repository справді потрібен у Laravel DDD

Репозиторій не потрібен для кожної Eloquent-моделі. У DDD він має сенс як межа збереження aggregate або коли прикладний рівень не повинен знати деталі збереження.

90
what-i-would-do-differently-if-i-started-a-ddd-project-again-cover.png
Ларавель

Що я змінила б, якби починала DDD-проєкт знову

Якби я починала DDD-проєкт знову, я б менше намагалася спроєктувати все наперед. Раніше фіксувала б інваріанти, обережніше вводила abstraction, чіткіше відділяла читання і менше дозволяла таблицям диктувати форму доменної моделі.

72