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
DDD in PHP, on example of Symfony
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Oleg Zinchenko
July 24, 2014
Programming
4.6k
10
Share
DDD in PHP, on example of Symfony
Introduction to DDD on example of Symfony
Oleg Zinchenko
July 24, 2014
More Decks by Oleg Zinchenko
See All by Oleg Zinchenko
ORO Meetup #4
cystbear
0
85
Keep It Simple Security (Symfony Cafe 28-01-2016)
cystbear
0
130
Erlang (GeekTalks)
cystbear
0
80
Clojure basics
cystbear
0
87
Welcome to Erlang
cystbear
0
100
Erlang/N2O KNPMeetup
cystbear
0
170
Symfony Best Practices and beyond
cystbear
1
240
DDD on example of Symfony (SymfonyCamp UA 2014)
cystbear
3
930
MongoDB KNPLabs GeekTime
cystbear
1
94
Other Decks in Programming
See All in Programming
LLM Plugin for Node-REDの利用方法と開発について
404background
0
150
さぁV100、メモリをお食べ・・・
nilpe
0
120
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
780
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.2k
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.3k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3k
CSC307 Lecture 17
javiergs
PRO
0
310
Modding RubyKaigi for Myself
yui_knk
0
860
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
260
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
2
970
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
1
650
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Designing Experiences People Love
moore
143
24k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
150
It's Worth the Effort
3n
188
29k
Believing is Seeing
oripsolob
1
140
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
210
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
240
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
Transcript
DDD in PHP on example of Symfony
cystbear Symfony expert MongoDB adept Erlang fun OSS doer KNPer
https://twitter.com/1cdecoder https://github.com/cystbear http://knplabs.com/
Learning Pyramid
PHP? ORLY?
What this talk about?
About useful tool/lib?
About success story?
No! It’s about idea Motivation!
MVC
Where to store business logic? Model View Controller
Where to store business logic? Model View Controller
Where to store business logic? Model View Controller
Where to store business logic? Model View Controller -- YEAH!
Welcome to Fat Stupid Ugly Controllers FSUC/FUC http://blog.astrumfutura.com/2008/12/the-m-in-mvc-why-models-are-misunderstood-and-unappreciated/ http://zendframework.ru/anonses/model-with-mvc http://habrahabr.ru/post/175465/
Anemic (Domain) Model http://www.martinfowler.com/bliki/AnemicDomainModel.html http://habrahabr.ru/post/224879/ “In essence the problem with
anemic domain models is that they incur all of the costs of a domain model, without yielding any of the benefits.” Martin Fowler
Persistence Layer Model
None
What is Not MVC (phew!) Request / Response Framework HTTP
Framework http://fabien.potencier.org/article/49/what-is-symfony2
What about model, persistence layer?
Meet Doctrine http://www.doctrine-project.org/ SQL -- DBAL + ORM MongoDB CouchDB
OrientDB PHPCR ODM OXM
What is Inversion of control Service Locator Dependency Injection Container
http://www.martinfowler.com/articles/injection.html http://fabien.potencier.org/article/11/what-is-dependency-injection
Services http://groovy.codehaus.org/ https://grails.org/ Single Class With its Deps (min) set
Easy to Replace Easy to Test MVC(S)!
Controller’s pray https://twitter.com/ornicar Get Request Submit form if any Call
one Service method Return Response Rendering HTML far away
Managers Managers Managers http://blog.codinghorror.com/i-shall-call-it-somethingmanager/ http://stackoverflow.com/questions/1866794/naming-classes-how-to- avoid-calling-everything-a-whatevermanager <SmtManager> <WhatEverManager> <MyManager> <EtcManager>
Real Pain class BackendUserProgramsPossessionFormHandler { protected $dep1; // deps holder
props public function __construct(DepsClass $dep1 /*, ...*/) { $this->dep1 = $dep1; } public function process(Form $form) { $this->dep1->makeHappy($form); // ... }
How Kris writes Symfony apps#44 https://twitter.com/kriswallsmith http://www.slideshare.net/kriswallsmith/how-kris-writessymfonyapps
https://twitter.com/kriswallsmith http://www.slideshare.net/kriswallsmith/how-kris-writessymfonyapps How Kris writes Symfony apps#44
Domain Logic Patterns http://martinfowler.com/books/eaa.html
Domain Logic Patterns http://martinfowler.com/books/eaa.html Transaction Script Domain Model Table Module
Service Layer
Transaction Script
Domain Model
Table Module
Domain Logic & Application logic
Service Layer
None
What is next? RAD DDD Patterns Examples Layers Goodies
DDD != RAD Code First Do not Care about persistence
(yet)
Domain Model Repository Value Object DTO Strategy State Patterns &
Code
Domain Model
Domain Model <?php namespace MegaCorp\Core\Product; class Product { private $id;
private $name; private $recognitionStrategy; public function __construct( ProductId $id, $name, $recognitionStrategy ) { $this->id = $id; $this->name = $name; $this->recognitionStrategy = $recognitionStrategy; }
Repository <?php namespace MegaCorp\Core\Product; interface ProductRepository { public function find(ProductId
$productId); public function findAll(); public function add(Product $product); public function remove(Product $product); }
Value Object <?php namespace MegaCorp\Core; class ProductId { private $value;
public function __construct($value) { $this->value = (string) $value; } public function getValue() { return $this->value; } }
Value Object DateRange
Value Object DateRange <?php public function findByDateRange( \DateTime $from, \DateTime
$to ) class DateRange { private $from; private $to; public function __construct(\DateTime $from, \DateTime $to) { $this->from = $from; $this->to = $to; } } public function findByDateRange(\DateRange $range)
Value Object Money
<?php class Money { private $amount; private $currency; public function
__construct($amount, Currency $currency) { // ... } } Value Object Money
<?php class ProfileData { public $firstName; public $lastName; public $birthday;
} DTO
Strategy
______ ______ _______ _______ / | / __ \ |
\ | ____| | ,----'| | | | | .--. || |__ | | | | | | | | | || __| | `----.| `--' | | '--' || |____ \______| \______/ |_______/ |_______|
src └── MegaCorp ├── ApiBundle │ ├── Controller │ │
└── ... │ └── MegaCorpApiBundle.php ├── Core │ └── Product │ ├── Product.php │ ├── ProductId.php │ └── ProductRepository.php └── CoreBundle ├── Controller │ └── ... ├── Repository │ ├── InMemoryProductRepository.php │ └── MongoDbProductRepository.php └── MegaCorpCoreBundle.php Directory structure
Layers
Layers Domain Layer -- heart of your application, Entities and
Repositories Application Layer -- Controllers Presentation Layer -- Templates / DTOs for serializer Infrastructure Layer -- framework, persistence, concrete implementations of Domain Layer
Useful goodies
BBB DDD by Eric Evans http://amzn.com/0321125215/
DDD Quickly by InfoQ http://www.infoq.com/minibooks/domain-driven-design-quickly
PoEAA by Martin Fowler http://amzn.com/B008OHVDFM/
DDD and Patterns by Jimmy Nilsson http://amzn.com/B0054KOKQQ/
Links http://dddcommunity.org/ http://williamdurand.fr/ http://welcometothebundle.com/ http://verraes.net/ http://jimmynilsson.com/blog/ http://www.martinfowler.com/ http://elephantintheroom.io/ -- podcast
http://msdn.microsoft.com/en-us/magazine/dd419654.aspx http://www.martinfowler.com/bliki/AnemicDomainModel.html http://martinfowler.com/bliki/CQRS.html
None
https://joind.in/11576 Thanks!