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 in PHP, on example of Symfony
Search
Oleg Zinchenko
July 24, 2014
Programming
4.6k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
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
170
Symfony Best Practices and beyond
cystbear
1
250
DDD on example of Symfony (SymfonyCamp UA 2014)
cystbear
3
930
MongoDB KNPLabs GeekTime
cystbear
1
98
Other Decks in Programming
See All in Programming
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.3k
App Intentsのビルドプロセスを支える技術
kntkymt
0
500
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.7k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
110
AHC070解法紹介
eijirou
0
150
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
270
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
370
カツオ、ご期待ください
suneo3476
0
140
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
210
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
430
Side Projects
sachag
456
43k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
KATA
mclloyd
PRO
35
16k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
My Coaching Mixtape
mlcsv
0
330
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
480
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
730
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!