Domain-Driven Design v Symfony jako videokurz.
Ke každé kapitole knihy jeden nebo dva díly o 7–13 minutách. Kód se v nich skládá po řádcích, diagramy vznikají před očima a každý díl končí otázkou na rozmyšlenou a krátkým opakováním. Číslo dílu odpovídá kapitole, takže video a text jdou číst i sledovat střídavě.
Přehrávač YouTube se načte až po kliknutí · otevřít na YouTube (nové okno) ↗
Úvod a strategie
9 dílů · vyšlo 2 · kapitoly v knize-
7:47 Díl 01 · kapitola 01Co je Domain-Driven Design?
Proč DDD začíná jazykem a hranicemi: Ubiquitous Language, Bounded Context, strategický a taktický design a kdy se DDD nevyplatí.
Kapitola v knize: Co je Domain-Driven Design → -
9:00 Díl 02a · kapitola 02Core Domain a subdomény: kam investovat
Core, Supporting a Generic subdomény: kde se vyplatí plné DDD, kde stačí CRUD a co koupit. Pětibodový test Core Domain a anti-vzor „všechno je Core“.
Kapitola v knize: Subdomény: Core, Supporting, Generic → -
Připravuje se
Díl 02b · kapitola 02Subdomény v Symfony: kód, sourcing, audit
Jak se Core, Supporting a Generic propíšou do Bounded Contextů, do struktury projektu v Symfony a do rozhodnutí build, nebo buy. A proč klasifikace stárne.
Kapitola v knize: Subdomény: Core, Supporting, Generic → -
Připravuje se
Díl 03a · kapitola 03Context Mapping: vztahy mezi Bounded Contexty
Context Map a vztahy mezi kontexty: Partnership, Shared Kernel, Customer/Supplier a Separate Ways. Kdo komu dodává model, kdo rozhoduje a co to znamená v Symfony.
Kapitola v knize: Bounded Context a Context Mapping → -
Připravuje se
Díl 03b · kapitola 03Anti-Corruption Layer, OHS a Published Language
Role na hranici mezi kontexty: Conformist, Anti-Corruption Layer, Open Host Service a Published Language v Symfony 8. Plus jak nakreslit Context Map za 90 minut a co s Big Ball of Mud.
Kapitola v knize: Bounded Context a Context Mapping → -
Připravuje se
Díl 04a · kapitola 04Event Storming: workshop od stěny k agregátu
Event Storming prakticky: notace, Big Picture krok za krokem, Process Modelling a Software Design. A jak se lepicí papírky promítnou do tříd a testů v Symfony.
Kapitola v knize: Event Storming a Domain Storytelling → -
Připravuje se
Díl 04b · kapitola 04Domain Storytelling a výstup z Event Stormingu
Domain Storytelling jako doplněk Event Stormingu, anti-vzory workshopů a co musí po workshopu jít do repozitáře, aby se slovník z místnosti neztratil.
Kapitola v knize: Event Storming a Domain Storytelling → -
Připravuje se
Díl 05a · kapitola 05Conway's Law a Team Topologies: týmy kolem kontextů
Proč architektura kopíruje komunikaci týmů, proč má Bounded Context jednoho vlastníka a jak ho navrhnout podle Team Topologies: čtyři typy týmů a tři interakční módy.
Kapitola v knize: Conway's Law a Team Topologies → -
Připravuje se
Díl 05b · kapitola 05Inverse Conway Maneuver a kognitivní zátěž týmů
Jak strukturu týmů vědomě změnit: Inverse Conway Maneuver ve čtyřech krocích, kognitivní zátěž jako limit počtu kontextů na tým, nejčastější organizační anti-vzory a jak reorganizaci obhájit metrikami DORA.
Kapitola v knize: Conway's Law a Team Topologies →
Taktické modelování
6 dílů · kapitoly v knize-
Připravuje se
Díl 06a · kapitola 06Entity a Value Objects v PHP 8.4: identita a hodnota
Entita a hodnotový objekt v PHP 8.4 a Symfony 8: proč se entity porovnávají přes ID, odkud se ID bere, proč má každé vlastní třídu a jak vypadají Email a Money, které jsou platné už od konstruktoru.
Kapitola v knize: Základní koncepty DDD → -
Připravuje se
Díl 06b · kapitola 06Agregát, repozitář a doménové události v Symfony
Agregát s kořenem a pojmenovanou továrnou, úzký repozitář, doménová služba bez stavu a doménové události: kde je zaznamenat, kdy je publikovat a proč nikdy v konstruktoru.
Kapitola v knize: Základní koncepty DDD → -
Připravuje se
Díl 07a · kapitola 07Aggregate design: hranice, invarianty, transakce
Kde vést hranici agregátu: invarianty jako východisko, malé agregáty podle Vernonových vodítek, jeden agregát na transakci, eventual consistency přes ságu a odkazy mezi agregáty jen přes ID.
Kapitola v knize: Návrh agregátu → -
Připravuje se
Díl 07b · kapitola 07Agregát v Doctrine ORM 3: verze, mapování, zátěž
Jak agregát namapovat v Doctrine ORM 3, aby hranice zůstala hranicí: vlastní typy místo asociací mezi agregáty, verze na kořeni a proč sama nestačí, velké kolekce, hot aggregate, volba identifikátoru a postup návrhu.
Kapitola v knize: Návrh agregátu → -
Připravuje se
Díl 08a · kapitola 08Specification Pattern: pravidla bez vnořených if
Specification Pattern v PHP 8.4 a Symfony 8: doménové pravidlo jako pojmenovaný objekt, skládání přes and, or a not místo vnořených ifů, kdy se vzor nevyplatí a jak tutéž specifikaci přeložit do dotazu přes Doctrine Criteria.
Kapitola v knize: Doplňující taktické vzory → -
Připravuje se
Díl 08b · kapitola 08Domain Service, Factory a Module v Symfony
Kdy má doménová služba vzniknout a kdy je to handler v přestrojení, kdy nestačí named constructor a přichází Factory class, proč reconstitute nekontroluje invarianty a jak moduly podle Bounded Contextů uhlídat v CI.
Kapitola v knize: Doplňující taktické vzory →
Architektura a implementace
6 dílů · kapitoly v knize-
Připravuje se
Díl 09a · kapitola 09Hexagonal vs. Onion Architecture v Symfony: kdy co
Proč architektonický styl není totéž co DDD, co umí a neumí vrstvy, jak v Symfony zapojit porty a adaptéry (driving, driven, autowiring, #[AsAlias]) a čím se Onion liší od Hexagonal.
Kapitola v knize: Architektonické styly → -
Připravuje se
Díl 09b · kapitola 09Clean Architecture a Vertical Slice v Symfony 8
Co Clean Architecture přidává k Hexagonal a Onion a proč je její use case v Symfony s Messengerem prostě command handler. Jak Vertical Slice přeskládá src/ podle feature, proč doménový model zůstává sdílený, jak styl vybrat podle subdomény a šest anti-vzorů napříč styly.
Kapitola v knize: Architektonické styly → -
Připravuje se
Díl 10a · kapitola 10Doctrine a Value Objects: agregát bez stringů
Agregát User v Symfony 8 a Doctrine ORM 3: co smí doména importovat, struktura projektu podle Bounded Contextů, privátní konstruktor s továrnou, hodnotové objekty přímo v entitě díky custom typům a embeddables. A dvě volby, které vypadají čistěji, než jsou: oddělený persistence model a obecné transitionTo().
Kapitola v knize: Implementace v Symfony 8 → -
Připravuje se
Díl 10b · kapitola 10Command Handler v Symfony 8: registrace bez race condition
Registrace uživatele v Symfony 8 od HTTP požadavku po doménovou událost: command, handler a command bus, proč unikátnost e-mailu hlídá jen databáze, kdo řídí transakci, kudy posílat doménové události, proč catch kolem dispatch() nic nechytí a jak v kontejneru propojit repozitář s rozhraním.
Kapitola v knize: Implementace v Symfony 8 → -
Připravuje se
Díl 11a · kapitola 11Symfony Voter a DDD: kam patří autorizace
Kam v DDD aplikaci na Symfony 8 patří které autorizační pravidlo: tři časté chyby, čtyři vrstvy (Edge, Use Case, Aggregate, Field), access_control a past roles + allow_if, Voter a rozhodovací strategie unanimous, #[IsGranted] se statusCode 404, autorizace v Messenger workeru přes actorId a proč agregát vrací 409, ne 403.
Kapitola v knize: Autorizace v DDD → -
Připravuje se
Díl 11b · kapitola 11Multi-tenancy a ABAC v Symfony: autorizace dat
Co smí uživatel v DDD aplikaci na Symfony 8 vidět: citlivá pole v read modelu místo Twig if, seznamy filtrované v dotazu místo Voteru nad každým řádkem, ABAC a kdy z Voterů odejít (Vote::addReason, OPA, Cerbos), multi-tenancy přes Doctrine SQLFilter nastavený fail-closed, PostgreSQL Row-Level Security a testy autorizace po vrstvách.
Kapitola v knize: Autorizace v DDD →
Pokročilé vzory a infrastruktura
10 dílů · kapitoly v knize-
Připravuje se
Díl 12a · kapitola 12CQRS v Symfony Messengeru: dva modely bez druhé DB
CQRS v Symfony 8 bez mýtů: čím se liší od CQS, proč nepotřebuje Event Sourcing, druhou databázi ani frontu, kdy se vyplatí a kdy ne (Dahan, Fowler). Command, query a event bus v Messengeru s různým middlewarem, #[AsMessageHandler(bus: …)], doctrine_transaction vs. jeden agregát na transakci, command se záměrem, query handler nad read repozitářem, ViewModel a HandleTrait.
Kapitola v knize: CQRS → -
Připravuje se
Díl 12b · kapitola 12Read model a eventual consistency v CQRS
Read model v CQRS na Symfony 8: denormalizovaná tabulka mimo ORM (migrace, schema_filter), projektor na event busu a proč samotný upsert není idempotentní (last-write-wins, updated_at s mikrosekundami, DeduplicateMiddleware). Kdo událost odešle: synchronní projekce, fantomová a ztracená událost, DispatchAfterCurrentBusStamp. Okno zastaralosti v UI a HTTP (PRG, polling, read-your-writes, 202 s Retry-After), co musí rozhodovat write strana. Retry s jitterem, failure transport, monitoring a provoz workerů.
Kapitola v knize: CQRS → -
Připravuje se
Díl 13a · kapitola 13Event Sourcing v PHP: Event Store a agregát
Event Sourcing v Symfony 8: stav jako historie událostí a replay, Fowlerova a Verraesova definice, vztah k CQRS (dotaz na „všechny Gregy“). Kdy se ES vyplatí a proč Kafka ani RabbitMQ nejsou Event Store. Událost s create() a fromPayload(), čas zápisu proti doménovému času, tabulka event_store a optimistic locking přes UNIQUE (aggregate_id, version). Agregát s recordEvent() a apply*(), replay bez vedlejších efektů a repozitář s expectedVersion.
Kapitola v knize: Event Sourcing → -
Připravuje se
Díl 13b · kapitola 13Event Sourcing: projekce, snapshoty a upcasting
Event Sourcing v provozu: projekce jako pozice ve streamu (checkpoint, restart, rebuild, lag), event_store jako outbox a gap problem s auto-incrementem. Idempotentní projektor s tracking tabulkou v jedné transakci, UPDATE bez řádku při doručení mimo pořadí, rebuild a blue/green přepnutí. Snapshoty jako zahoditelná zkratka (Rolling Snapshot), restoreVersion a past s modulo. Verzování událostí: upcaster fullName → firstName + lastName, co upcasting nevyřeší, čtyři strategie, migrační události a GDPR (forgettable payloads vs. crypto-shredding).
Kapitola v knize: Event Sourcing → -
Připravuje se
Díl 14a · kapitola 14Saga Pattern: kompenzace místo transakce
Ságy v Symfony: proč jedna transakce přes čtyři Bounded Contexty neexistuje a proč ji nenahradí two-phase commit. Kompenzace jako doménová operace, ne rollback, neúplný vs. nečitelný mezistav a nevratné akce. Choreografie a její čtyři limity, orchestrace přes OrderProcessManager jako stavový automat a hranice logiky v Process Manageru.
Kapitola v knize: Ságy a Process Managery → -
Připravuje se
Díl 14b · kapitola 14Saga v produkci: idempotence a timeouty
Ságy v Symfony v provozu: stav Process Manageru jako Doctrine entita, idempotentní přechody přes eventId, guard stavového automatu a unikátní index na korelaci, optimistický zámek. Chybějící izolace ságy a semantic lock na objednávce. Timeout check přes DelayStamp v Symfony Messengeru, forward a backward recovery, pivot transakce a kompenzace, které se jen opakují.
Kapitola v knize: Ságy a Process Managery → -
Připravuje se
Díl 15a · kapitola 15Outbox Pattern: konec ztracených událostí
Dual-write problem v Symfony: zápis do databáze a odeslání do RabbitMQ jsou dvě transakce ve dvou systémech, takže se události ztrácejí, nebo vznikají phantom eventy. Proč ne two-phase commit a XA. Transactional Outbox: událost v téže Doctrine transakci jako agregát, relay a doručení at-least-once. Schéma outbox tabulky, povinný index (status, occurred_at) a PlaceOrderHandler, který překládá doménovou událost na integrační.
Kapitola v knize: Outbox Pattern → -
Připravuje se
Díl 15b · kapitola 15Idempotent Inbox: události bez duplicit
Outbox v provozu: relay jako Polling Publisher v Symfony Console commandu, singleton, nebo FOR UPDATE SKIP LOCKED, past zavřeného EntityManageru. Debezium a Outbox Event Router, Doctrine transport jako outbox bez vlastní tabulky a proč pořadí platí jen per agregát. Idempotent Inbox s UNIQUE (event_id, consumer) v téže transakci a hranice exactly-once efektu. Outbox lag, kompakce, failed řádky, výpadek brokeru a migrace existujícího projektu krok za krokem.
Kapitola v knize: Outbox Pattern → -
Připravuje se
Díl 16a · kapitola 16N+1 a read model v Doctrine: rychlé čtení v DDD
Výkon DDD aplikace na straně čtení: tři mýty o pomalém DDD a celá Knuthova věta o předčasné optimalizaci. N+1 dotazy z lazy kolekce v Doctrine ORM 3, EXTRA_LAZY, fetch join v DQL, past setMaxResults s fetch joinem a Paginator, eager fetch po dávkách a keyset paging místo OFFSETu. Žebříček eskalace od indexu po asynchronní projekci, DQL NEW do DTO, cache read modelu přes Symfony Cache Contracts s tagy a invalidací z doménové události a dvě čísla ze Symfony Profileru.
Kapitola v knize: Read modely, projekce a výkon → -
Připravuje se
Díl 16b · kapitola 16Unit of Work a hot aggregate: DDD pod zátěží
Výkon DDD aplikace na straně zápisu: kdy velký agregát opravdu zabolí a proč hranici určuje invariant, ne výkon. Identity Map, Unit of Work a dirty checking v Doctrine ORM 3, dávkový import s flush() a clear(), odpojené entity, read-only entity a DEFERRED_EXPLICIT. Hromadný DQL UPDATE, toIterable() a import rozdělený přes Symfony Messenger. V provozu hot aggregate a jeho metrika, pesimistický zámek jako anti-vzor, replikační lag, projection lag ve dvou číslech a čtyři čísla, která se vyplatí sledovat trvale.
Kapitola v knize: Read modely, projekce a výkon →
Praxe a provoz
11 dílů · kapitoly v knize-
Připravuje se
Díl 17a · kapitola 17Unit testy agregátů a InMemory repozitář v PHP
Testování doménové vrstvy bez Symfony kernelu: testovací pyramida, ice-cream cone a proč poměr vrstev kopíruje tloušťku doménové logiky. PHPUnit 13 s atributy místo anotací, test hodnotového objektu, entity a agregátu. Doménové události přes releaseEvents(), trait s asercemi a given-when-then nad event-sourced agregátem. Test doubles podle Meszarose a Fowlera, InMemory repozitář místo mocku a Test Data Builder pro testovací data.
Kapitola v knize: Testování DDD → -
Připravuje se
Díl 17b · kapitola 17Integrační testy Doctrine, Messenger a Deptrac
Testy tam, kde vstupuje infrastruktura. Integrační test repozitáře proti skutečné databázi, flush() a clear() kvůli Identity Map, transakční rollback přes dama/doctrine-test-bundle a jeho limity. Funkční test přes WebTestCase, asynchronní tok s in-memory transportem a zenstruck/messenger-test, test idempotence handleru a dvě garance outboxu. Architektonické testy s Deptracem a PHPArkitectem, code coverage a mutation testing s Infection.
Kapitola v knize: Testování DDD → -
Připravuje se
Díl 18a · kapitola 18Strangler Fig: migrace z CRUD na DDD bez přepisu
Kdy se migrace z CRUD na DDD vyplatí a kdy ji nezačínat. Strangler Fig místo přepisu najednou, Sacrificial Architecture a přechodová architektura, která má datum expirace. Datová migrace ve čtyřech fázích: dual-write, backfill, shadow reads a cutover přes feature flag. Anti-Corruption Layer s vyjmenovaným mapováním legacy stavů a techniky Branch by Abstraction, Parallel Change a Mikado.
Kapitola v knize: Migrace z CRUD na DDD → -
Připravuje se
Díl 18b · kapitola 18Legacy CRUD na DDD: od kontroleru k agregátu
Jak dostat doménová pravidla z tlustého CRUD kontroleru do agregátu krok za krokem. Analýza domény a seznam toho, co nemigrovat. Hodnotové objekty a agregát User s pojmenovanou továrnou, repozitář a tenký kontroler s commandem. Charakterizační testy podle Michaela Featherse, švy v Symfony a záměrná změna chování, kterou schvaluje produkt.
Kapitola v knize: Migrace z CRUD na DDD → -
Připravuje se
Díl 19a · kapitola 19Microservices a Bounded Context: kdy stačí monolit
Bounded Context je logická hranice modelu, microservice fyzická hranice nasazení. Tři varianty mapování, šest podmínek pro vlastní službu, modulární monolit s hranicemi hlídanými PHPArkitectem a pět příznaků distributed monolithu.
Kapitola v knize: DDD a microservices → -
Připravuje se
Díl 19b · kapitola 19Microservices v Symfony Messengeru: kontrakt bez sdílení
Když Bounded Context dostane vlastní službu, hranice vede přes síť. Kdy volat synchronně a kdy publikovat událost, kolik dat událost nese, komu patří data, jak v Symfony Messengeru postavit kontrakt bez sdílené PHP třídy a co musí umět provoz.
Kapitola v knize: DDD a microservices → -
Připravuje se
Díl 20a · kapitola 20Doctrine a DDD agregát: Unit of Work, VO, identita
Kde Doctrine ORM 3 naráží na doménový model: transakce přes dva agregáty a zavřený EntityManager, getter, který nechtěně mění stav, flush($entity) a clear($entityName), které ORM 3 tiše ignoruje, mapování hodnotových objektů a dědičnosti a identita vytvořená v PHP ještě před uložením.
Kapitola v knize: DDD v praxi – kde to bolí → -
Připravuje se
Díl 20b · kapitola 20Symfony Messenger: idempotence a pořadí zpráv v DDD
Provozní pasti Symfony Messengeru: jak dohledat ztracenou zprávu podle correlation ID, proč idempotency klíč z náhodného UUID nezastaví dvojklik, jak zapsat klíč bez závodu i bez ztracené zprávy, co dělat se zprávou, která přišla dřív než její předpoklad, a kde má vzniknout Command, když vstup přichází ze Symfony Form nebo z API Platform.
Kapitola v knize: DDD v praxi – kde to bolí → -
Připravuje se
Díl 21a · kapitola 21Anemic Domain Model a God Aggregate: chyby v modelu
Tři anti-vzory doménového modelu a jak je najít ve vlastním kódu: anémický model jako účet bez protihodnoty, Vernonův test dvou otázek a proč getter v PHP 8.4 už není spolehlivý příznak. Kdy anémie chybou není (Transaction Script), kdy se hodnotový objekt vyplatí a kdy je jen ceremonie, a proč God Aggregate nic nechrání – i to, že agregát jde zmenšit příliš.
Kapitola v knize: Anti-vzory a typické chyby → -
Připravuje se
Díl 21b · kapitola 21DDD anti-patterns: sdílená databáze a měnitelné události
Anti-vzory na hranicích a jak je najít ve vlastním kódu: sdílená databáze mezi Bounded Contexty a tři cesty ven s jejich cenou, měnitelné události a proč potřebují dvě časová razítka, doménová pravidla v Doctrine repozitáři a jedno pravidlo pro Deptrac, over-engineering a drift Ubiquitous Language. Na konci přehled všech osmi anti-vzorů kapitoly s rozpoznávacími znaky.
Kapitola v knize: Anti-vzory a typické chyby → -
Připravuje se
Díl 22 · kapitola 22When not to use DDD: kdy stačí CRUD a jak se rozhodnout
Kdy Domain-Driven Design nepoužívat a co místo něj: rozhodovací strom po subdoménách, sedm situací od CRUD adminu přes startup a ETL po tým bez expertů, pseudo-DDD a Bubble Context, Khononovova heuristika pro volbu vzoru byznys logiky a pět podmínek, kdy se plné DDD naopak vyplatí.
Kapitola v knize: Kdy DDD nepoužívat →
Syntéza
3 díly · kapitoly v knize-
Připravuje se
Díl 23 · kapitola 23DDD příklady v Symfony: e-shop, blog, uživatelé
Tři malé projekty v Symfony 8 na jedné kostře kontroler → command bus → handler → agregát → repozitář → událost. Proč objednávka tiše stojí bez relaye a workeru, tiché pasti instalace (Doctrine mapování, .env.local v testech), přechod z košíku do objednávky přes událost a překlad na hranici, kde leží pravidlo u blogu a u správy uživatelů a co se změní, až projekty porostou.
Kapitola v knize: Praktické příklady → -
Připravuje se
Díl 24a · kapitola 24DDD případová studie: od workshopu ke kódu
Ilustrativní případová studie: správa projektů v Symfony 8 od Event Stormingu k agregátům. Jedno slovo „uživatel“ se čtyřmi významy, experti jako kontrola hranic, Context Map čtená kriticky (port není ACL, interní typy nejsou Published Language), agregáty Project a Task, přechodová tabulka stavů, past public readonly identifikátoru v Doctrine a handlery CreateProject a AssignTask.
Kapitola v knize: Případová studie → -
Připravuje se
Díl 24b · kapitola 24CQRS read model a projekce: případová studie
Závěrečný díl kurzu a druhá půlka ilustrativní případové studie: výpis projektů z denormalizované tabulky project_list_view místo hydratace agregátů (jsonb, GIN index ruční migrací, proč ne readOnly), projekce se čtyřmi handlery a jedním, který idempotentní není, reconciler z cronu pro přeházené zprávy, okno eventual consistency a pět rozhodnutí modelového týmu i s cenou. Na konci ohlédnutí za celým kurzem.
Kapitola v knize: Případová studie →