Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Domain-Driven Design in PHP
Search
Wojciech Sznapka
September 27, 2014
Programming
4
2.1k
Domain-Driven Design in PHP
Wojciech Sznapka
September 27, 2014
Tweet
Share
More Decks by Wojciech Sznapka
See All by Wojciech Sznapka
Getting started with Firebase in Angular
sznapka
1
75
PiHome – home automation done with Raspberry PI and Python
sznapka
0
400
Big data in the trenches
sznapka
1
370
PiHome – home automation done with Raspberry PI and Python
sznapka
0
370
Map-Reduce patterns
sznapka
3
270
An introduction to AngularJS
sznapka
0
240
Achieving wise architecture with Symfony2 @ SPUG#5
sznapka
2
210
Smart development environments
sznapka
2
1.6k
Automated tests - facts and myths
sznapka
1
1.7k
Other Decks in Programming
See All in Programming
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
280
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
10
1.7k
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
250
一人でAIプロダクトを作るための工夫 〜技術選定・開発プロセス編〜 / I want AI to work harder
rkaga
7
1.8k
コーディングは技術者(エンジニア)の嗜みでして / Learning the System Development Mindset from Rock Lady
mackey0225
2
250
実践!App Intents対応
yuukiw00w
1
220
Understanding Kotlin Multiplatform
l2hyunwoo
0
250
画像コンペでのベースラインモデルの育て方
tattaka
3
1.4k
CEDEC2025 長期運営ゲームをあと10年続けるための0から始める自動テスト ~4000項目を50%自動化し、月1→毎日実行にした3年間~
akatsukigames_tech
0
110
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.5k
decksh - a little language for decks
ajstarks
4
21k
Claude Code で Astro blog を Pages から Workers へ移行してみた
codehex
0
180
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
1k
Faster Mobile Websites
deanohume
308
31k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Building Applications with DynamoDB
mza
96
6.5k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
880
Building Adaptive Systems
keathley
43
2.7k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Transcript
Once upon the time, in ancient Greece...
Hercules got into to serious troubles...
King Eurystheus ordered Hercules to clean up Augeas' stables
The stables was complex and full of mud
As accounted for real hero, Hercules used nifty trick
He changed flow of a river and directed it into
two holes in opposite walls
The task has been solved in a single day
Unfortunately there’s no such heroic attempts in history of software
development
Instead of heroes, you need ...
Domain-Driven Design in PHP Wojciech Sznapka PHPCon 2014
Hi! I'm Wojciech Sznapka * Head Of Development @ Cherry
Poland * Coding since 10 years * Interested in architecture, Big Data, Ice Hockey
DDD essentials
Domain-Driven Design is a way of developing complex software ...
... by focusing on core domain first ...
... modeling and abstracting reality using “building blocks” and proven
design patterns ...
and delaying technical decisions as much as possible.
It’s all about the domain
You can’t build properly working software without deep domain knowledge
But, you won’t understand the whole domain at once. It's
an iterative process
You need evolving model
It’s crucial to have common understanding from day one...
… and to speak Ubiquitous Language with stakeholders and Domain
Experts
The model
Good model act as Ubiquitous Language
None
It reflect domain logic as much as possible
It's build using layers * User interface * Application layer
* Domain layer * Infrastructure layer
* source: Domain-Driven Design Quickly by InfoQ
User interface presents and interprets user commands
Application layer coordinates activities. It's ought to be very thin
Domain layer is the heart of the system, responsible for
business logic
Infrastructure layer acts as support, providing persistence, tools, etc.
Let’s speak about entities, DDD first class citizens
Entity represents a business being
Entity is not a simple Data Transfer Object or data
container
Therefore avoid anemic entities . Good entity should provide behavior,
besides identity and attributes!
Infrastructure layer helps with persisting entities (using a backing service*
of your choice) * http://12factor.net/backing-services
None
Entities are supported by value objects
Value objects conceptually does not provide any identity, so they
can be shared
To achieve that, value objects need to be immutable* *
http://blog.sznapka.pl/immutable-value-objects-in-php
The important fact: value objects are type hintable
None
Large graph of entities can be difficult to handle consistently
DDD introduced a term Aggregate which is collection of objects
...
... bound with aggregate root and hiding underlying objects from
the external world
Aggregates provides a coherent interface to operate on sub-graph of
the model
During development of ubiquitous language you’ll find that some actions
don’t belong to any object
Such situations are solved with domain services
Services employ various entities, value objects, factories, repositories to do
their job
None
When dealing with complex objects, their creation could be complex
and it's good to hide that logic
Well known factories will do the trick
Factory hides instantiation complexity and enables interchangeability in the future
None
While factories help with objects creation, it is equally important
to abstract objects retrieval
Repository design pattern abstracts objects retrieval from a storage
It’s extremely important to place all data access logic in
repositories
Infrastructure layer helps a lot here
It uses your ORM library to build specific queries or
use other vendors to obtain objects
More important fact is that repository* is replaceable * like
the most of DDD building blocks
Model boundaries
It’s important to draw bold borders inside your system, as
it grows and becomes complex
None
None
None
When different stakeholders start to confuse you with vocabulary
It's good time to think about bounded contexts
“Bounded Context is a central pattern in Domain-Driven Design”* *
http://martinfowler.com/bliki/BoundedContext.html
It’s quite sure, that bounded contexts will share common concepts
Therefore create context map to outline points of contact between
them
Also, distinguish core domain from generic ones...
Choose proper bounded context collaboration model
Shared kernel, when two teams work closely on subset of
domain
They acts as partners, and access each other bounded context
with common code
Customer-Supplier, when upstream team provides an API and downstream teams
consume it
Customer team can influence Supplier to modify model
Open Host Service, when interface is defined by widely known
protocol
It's typical SOA approach
Or: * Partner * Conformist * Separate ways * Anticorruption
layer * Published language
Taming the beast A.K.A. Summary
OOP is not enough
DDD is great for complex problems
You can pick parts of DDD and still benefit out
of it
You should be aware of duplication and complex structures in
DDD
DDD doesn't care about your fancy: Symfony/Zend Framework/Laravel * *
delete where inapplicable
Be PRAGMATIC! * * take care about your core domain
in the first place
Thanks for your attention! Ask me anything blog.sznapka.pl wojciech@sznapka.pl twitter.com/sznapka
Your feedback is important! https://joind.in/11844