Web campodessa zinchenko v2 (23-07-2014)

Download Web campodessa zinchenko v2 (23-07-2014)

Post on 19-Aug-2014




1 download




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! Its 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 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)! Controllers 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 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 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