Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DDD on example of Symfony (SymfonyCamp UA 2014)
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Oleg Zinchenko
November 02, 2014
Programming
930
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DDD on example of Symfony (SymfonyCamp UA 2014)
How I realized that MVC is a myth and why MVC duped us for a years.
Oleg Zinchenko
November 02, 2014
More Decks by Oleg Zinchenko
See All by Oleg Zinchenko
ORO Meetup #4
cystbear
0
88
Keep It Simple Security (Symfony Cafe 28-01-2016)
cystbear
0
140
Erlang (GeekTalks)
cystbear
0
89
Clojure basics
cystbear
0
93
Welcome to Erlang
cystbear
0
110
Erlang/N2O KNPMeetup
cystbear
0
180
Symfony Best Practices and beyond
cystbear
1
250
MongoDB KNPLabs GeekTime
cystbear
1
98
DDD in PHP, on example of Symfony
cystbear
10
4.6k
Other Decks in Programming
See All in Programming
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
200
残高管理から台帳サービスへの進化
artoy
0
170
カツオ、ご期待ください
suneo3476
0
150
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
450
SREの越境 / SRE Collaboration
y0hgi
2
300
Domain-Driven Transformation
hschwentner
2
2.3k
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
7.6k
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
setup-vp GitLab対応の裏側
naokihaba
0
150
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
270
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
230
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
550
Featured
See All Featured
Exploring anti-patterns in Rails
aemeredith
4
520
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
290
Building AI with AI
inesmontani
PRO
1
1.3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Amusing Abliteration
ianozsvald
1
330
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
390
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Designing Experiences People Love
moore
143
24k
Transcript
DDD on example of Symfony Oleg ZInchenko
[email protected]
cystbear Symfony expert MongoDB adept Erlang fun OSS doer KNPer
https://twitter.com/1cdecoder https://github.com/cystbear http://knplabs.com/
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
http://www.martinfowler.com/articles/injection.html http://fabien.potencier.org/article/11/what-is-dependency-injection http://fabien.potencier.org/article/13/introduction-to-the-symfony-service-container
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
https://twitter.com/mr_r_miller/status/522343384900718592 Just A Thought
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
Thanks!