SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Применение DDD подхода в
Symfony 2 приложении
Что?
Проблемно-ориентированное проектирование
«Набор принципов и схем, помогающих
разработчикам создавать изящные
системы объектов.»
Wikipedia
Чем не является?
●

RAD
Обилие связующего кода, десятки
вспомогательных объектов и тд.

●

Серебряной пулей
Подходит не для всех бизнес приложений.
Где?
Бизнес
ERP, CRM, MDM, EAM,
SCM и другие умные
абривиатуры.

Сервисы
Совместная разработка,
онлайн-офис, agile
инструменты.

Игры
Сервера массовых
многопользовательских
онлайн-игр.
Когда?
●

Обилие бизнес-процессов
Не CRUD приложение.

●

Доступ к эксперту в предметной области
Skype'а может быть не достаточно.

●

Квалифицированная команда
Умение применять: шаблоны проектирования; модульные тесты; CI.
Symfony 2 как основа для
DDD приложения
●

Контейнер зависимостей
Принцип инверсии зависимостей — ключевой элемент хорошей архитектуры

●

Doctrine ORM
DataMapper, Events, Table Inheritance

●

Множество готовых абстракций
EventDispatcher, Form, Request, User

●

Сообщество
FOSRestBundle, JMSSerializer, NelmioApiDocBundle
Каноничный подход к архитектуре
Symfony 2 приложения
●

Бандлы как готовое приложение
Бизнес-правила связаны с фреймворком?

●

Анемичная доменная модель
Объекты без поведения. Структуры?

●

Бизнес-логика в сервисах
Объекты без ограничения ответственности?

●

«Жесткая» конфигурация DIC
Нет параметров. Не используются alias.

Почему так? KISS!
Каноничный подход к архитектуре
Symfony 2 приложения
Бандлы как готовое приложение
DDD подход к архитектуре
Symfony 2 приложения
Бандлы как средство интеграции

Бандл предоставляет реализации
интерфейсов домена в рамках
текущего приложения.
DDD подход к архитектуре
Symfony 2 приложения
Бандлы как средство интеграции
Doctrine ORM не умеет
связывать (пока) объекты
значения.
Решение:
●

●

●

Использовать lifecycle callbacks;
PostLoad — для десериализации
столбцов базы в объект-значение
PrePersist и PreUpdate — для
сериализации объекта
Каноничный подход к архитектуре
Symfony 2 приложения
Анемичная доменная модель
DDD подход к архитектуре
Symfony 2 приложения
Насыщенная модель предметной области
DDD подход к архитектуре
Symfony 2 приложения
Насыщенная модель предметной области
●

●

Единый язык — наименование объектов и методов домена
имеют смысл для эксперта предметной области.
Нет get* и set* методов.
Building an Object Model: No setters allowed

●

Объекты-значения — свойства, важные в той предметной
области, которую вы моделируете.
Mathias Verraes: Money

●

Сущности защищены от стороннего кода
Mathias Verraes: Unbreakable Domain Models
Каноничный подход к архитектуре
Symfony 2 приложения
Бизнес-логика в сервисах

Вопрос: где должен быть метод createOrder?
DDD подход к архитектуре
Symfony 2 приложения
Сервисы как посредники между API и доменом

*Command классы — DTO для API данных.
Метод createOrder теперь располагается только в OrderService.
API для DDD приложения
●

Отдельный бандл
CoreDomain — CoreApiBundle.

●

Контроллеры как сервисы
Больше гибкости для UI.

●

CQRS — разделение
моделей чтения и записи
Account — AccountView
Order — OrderView
API для DDD приложения
REST — наш выбор!
●

Любые клиенты;
Браузер, мобильной приложение,
телевизор, чайник ...

●

Простота реализации;
еще проще с FOSRestBundle.

●

Документация;
NelmioApiDocBundle — поможет!
UI для DDD приложения
●

Отдельный бандл
CoreDomain — CoreViewBundle.

●

Формы — это часть UI
Формы соответствуют API командам,
а не доменным объектам.

●

JS MVC — это удобно!
Backbone, AngularJS, EmberJS,
KnockoutJS.
Идеи на будущее
●
●

●

●

Doctrine 2.5 — поддержка объектов-значений.
Zephir — для доменов со сложной
алгоритмикой.
DDD Serializer — сериализация в терминах
DDD.
???
Вопросы?
Facebook: https://www.facebook.com/zloyusr
VK: http://vk.com/shabouta

Weitere ähnliche Inhalte

Andere mochten auch

DDD on example of Symfony (SfCampUA14)
DDD on example of Symfony (SfCampUA14)DDD on example of Symfony (SfCampUA14)
DDD on example of Symfony (SfCampUA14)Oleg Zinchenko
 
DDD - модель вместо требований
DDD - модель вместо требованийDDD - модель вместо требований
DDD - модель вместо требованийSQALab
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in phpLeonardo Proietti
 
Anemic Domain Model - антипаттерн или SOLID?
Anemic Domain Model - антипаттерн или SOLID?Anemic Domain Model - антипаттерн или SOLID?
Anemic Domain Model - антипаттерн или SOLID?GoSharp
 
Yet Another Continuous Integration Story
Yet Another Continuous Integration StoryYet Another Continuous Integration Story
Yet Another Continuous Integration StoryAnton Serdyuk
 
Domain Driven Design - как, почему и зачем?
Domain Driven Design - как, почему и зачем?Domain Driven Design - как, почему и зачем?
Domain Driven Design - как, почему и зачем?ngrebnev
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Oleg Poludnenko
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Kacper Gunia
 
Ddd softwarepeople-2012-tsepkov
Ddd softwarepeople-2012-tsepkovDdd softwarepeople-2012-tsepkov
Ddd softwarepeople-2012-tsepkovMaxim Tsepkov
 
Design pattern in Symfony2 - Nanos gigantium humeris insidentes
Design pattern in Symfony2 - Nanos gigantium humeris insidentesDesign pattern in Symfony2 - Nanos gigantium humeris insidentes
Design pattern in Symfony2 - Nanos gigantium humeris insidentesGiulio De Donato
 
Meetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonyMeetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonymeeticTech
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsRoss Tuck
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#Pascal Laurin
 
A Practical Guide to Domain Driven Design: Presentation Slides
A Practical Guide to Domain Driven Design: Presentation SlidesA Practical Guide to Domain Driven Design: Presentation Slides
A Practical Guide to Domain Driven Design: Presentation Slidesthinkddd
 

Andere mochten auch (20)

DDD on example of Symfony (SfCampUA14)
DDD on example of Symfony (SfCampUA14)DDD on example of Symfony (SfCampUA14)
DDD on example of Symfony (SfCampUA14)
 
Основы доменной модели
Основы доменной моделиОсновы доменной модели
Основы доменной модели
 
DDD - модель вместо требований
DDD - модель вместо требованийDDD - модель вместо требований
DDD - модель вместо требований
 
Clean architecture with ddd layering in php
Clean architecture with ddd layering in phpClean architecture with ddd layering in php
Clean architecture with ddd layering in php
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 
Anemic Domain Model - антипаттерн или SOLID?
Anemic Domain Model - антипаттерн или SOLID?Anemic Domain Model - антипаттерн или SOLID?
Anemic Domain Model - антипаттерн или SOLID?
 
Yet Another Continuous Integration Story
Yet Another Continuous Integration StoryYet Another Continuous Integration Story
Yet Another Continuous Integration Story
 
Domain Driven Design - как, почему и зачем?
Domain Driven Design - как, почему и зачем?Domain Driven Design - как, почему и зачем?
Domain Driven Design - как, почему и зачем?
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
 
DDD with Behat
DDD with BehatDDD with Behat
DDD with Behat
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
 
Ddd softwarepeople-2012-tsepkov
Ddd softwarepeople-2012-tsepkovDdd softwarepeople-2012-tsepkov
Ddd softwarepeople-2012-tsepkov
 
Design pattern in Symfony2 - Nanos gigantium humeris insidentes
Design pattern in Symfony2 - Nanos gigantium humeris insidentesDesign pattern in Symfony2 - Nanos gigantium humeris insidentes
Design pattern in Symfony2 - Nanos gigantium humeris insidentes
 
Meetic Backend Mutation With Symfony
Meetic Backend Mutation With SymfonyMeetic Backend Mutation With Symfony
Meetic Backend Mutation With Symfony
 
TDD with phpspec2
TDD with phpspec2TDD with phpspec2
TDD with phpspec2
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
GRASP Principles
GRASP PrinciplesGRASP Principles
GRASP Principles
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
 
A Practical Guide to Domain Driven Design: Presentation Slides
A Practical Guide to Domain Driven Design: Presentation SlidesA Practical Guide to Domain Driven Design: Presentation Slides
A Practical Guide to Domain Driven Design: Presentation Slides
 

Ähnlich wie Применение DDD подхода в Symfony 2 приложении

Две крупные рыбы: One Identity Manager и Solar inRights
Две крупные рыбы: One Identity Manager и Solar inRightsДве крупные рыбы: One Identity Manager и Solar inRights
Две крупные рыбы: One Identity Manager и Solar inRightsКРОК
 
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...ActiveCloud
 
DDD: проблемы и решения при отражении модели предметной области в код
DDD: проблемы и решения при отражении модели предметной области в кодDDD: проблемы и решения при отражении модели предметной области в код
DDD: проблемы и решения при отражении модели предметной области в кодCUSTIS
 
3 средства автоматизации проектирования корпоративных приложений
3 средства автоматизации проектирования корпоративных приложений3 средства автоматизации проектирования корпоративных приложений
3 средства автоматизации проектирования корпоративных приложенийKewpaN
 
Обзор OMNITRACKER CleverENGINE
Обзор OMNITRACKER CleverENGINEОбзор OMNITRACKER CleverENGINE
Обзор OMNITRACKER CleverENGINECleverics
 
Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...DALEE digital agency
 
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Vadim Martynov
 
Бизнес-завтрак "Строим вместе безопасную СЭД"
Бизнес-завтрак "Строим вместе безопасную СЭД"Бизнес-завтрак "Строим вместе безопасную СЭД"
Бизнес-завтрак "Строим вместе безопасную СЭД"ИнтерТраст
 
виртуос
виртуосвиртуос
виртуосNov07
 
CompanyMedia4You - Нити управления
CompanyMedia4You - Нити управленияCompanyMedia4You - Нити управления
CompanyMedia4You - Нити управленияИнтерТраст
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
плакаты конькова ивана12[1].02.14
плакаты конькова ивана12[1].02.14плакаты конькова ивана12[1].02.14
плакаты конькова ивана12[1].02.14IKonkov
 
Архитектура CompanyMedia next
Архитектура CompanyMedia nextАрхитектура CompanyMedia next
Архитектура CompanyMedia nextИнтерТраст
 
Особенности внедрения систем управления проектами в проектных институтах
Особенности внедрения систем управления проектами в проектных институтахОсобенности внедрения систем управления проектами в проектных институтах
Особенности внедрения систем управления проектами в проектных институтахЕгор Воднев
 

Ähnlich wie Применение DDD подхода в Symfony 2 приложении (20)

Две крупные рыбы: One Identity Manager и Solar inRights
Две крупные рыбы: One Identity Manager и Solar inRightsДве крупные рыбы: One Identity Manager и Solar inRights
Две крупные рыбы: One Identity Manager и Solar inRights
 
i-Sys labs 2013
i-Sys labs 2013i-Sys labs 2013
i-Sys labs 2013
 
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...
Фокус на бизнес-эффективность - программно определяемый ЦОД и унифицированная...
 
DDD: проблемы и решения при отражении модели предметной области в код
DDD: проблемы и решения при отражении модели предметной области в кодDDD: проблемы и решения при отражении модели предметной области в код
DDD: проблемы и решения при отражении модели предметной области в код
 
3 средства автоматизации проектирования корпоративных приложений
3 средства автоматизации проектирования корпоративных приложений3 средства автоматизации проектирования корпоративных приложений
3 средства автоматизации проектирования корпоративных приложений
 
Основные конкурентные преимущества системы электронного документооборота Naum...
Основные конкурентные преимущества системы электронного документооборота Naum...Основные конкурентные преимущества системы электронного документооборота Naum...
Основные конкурентные преимущества системы электронного документооборота Naum...
 
Обзор OMNITRACKER CleverENGINE
Обзор OMNITRACKER CleverENGINEОбзор OMNITRACKER CleverENGINE
Обзор OMNITRACKER CleverENGINE
 
Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...Опыт реализации и поддержки больших проектов: координация команд, координация...
Опыт реализации и поддержки больших проектов: координация команд, координация...
 
Функциональные возможности и основные модули Naumen DMS
Функциональные возможности и основные модули Naumen DMSФункциональные возможности и основные модули Naumen DMS
Функциональные возможности и основные модули Naumen DMS
 
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
 
Бизнес-завтрак "Строим вместе безопасную СЭД"
Бизнес-завтрак "Строим вместе безопасную СЭД"Бизнес-завтрак "Строим вместе безопасную СЭД"
Бизнес-завтрак "Строим вместе безопасную СЭД"
 
Artsofte for b2 b
Artsofte for b2 b Artsofte for b2 b
Artsofte for b2 b
 
iRidium pro для HDL
iRidium pro для HDLiRidium pro для HDL
iRidium pro для HDL
 
Архитектура и интерфейсы Omega Production
Архитектура и интерфейсы Omega ProductionАрхитектура и интерфейсы Omega Production
Архитектура и интерфейсы Omega Production
 
виртуос
виртуосвиртуос
виртуос
 
CompanyMedia4You - Нити управления
CompanyMedia4You - Нити управленияCompanyMedia4You - Нити управления
CompanyMedia4You - Нити управления
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
плакаты конькова ивана12[1].02.14
плакаты конькова ивана12[1].02.14плакаты конькова ивана12[1].02.14
плакаты конькова ивана12[1].02.14
 
Архитектура CompanyMedia next
Архитектура CompanyMedia nextАрхитектура CompanyMedia next
Архитектура CompanyMedia next
 
Особенности внедрения систем управления проектами в проектных институтах
Особенности внедрения систем управления проектами в проектных институтахОсобенности внедрения систем управления проектами в проектных институтах
Особенности внедрения систем управления проектами в проектных институтах
 

Применение DDD подхода в Symfony 2 приложении

  • 1. Применение DDD подхода в Symfony 2 приложении
  • 2. Что? Проблемно-ориентированное проектирование «Набор принципов и схем, помогающих разработчикам создавать изящные системы объектов.» Wikipedia Чем не является? ● RAD Обилие связующего кода, десятки вспомогательных объектов и тд. ● Серебряной пулей Подходит не для всех бизнес приложений.
  • 3. Где? Бизнес ERP, CRM, MDM, EAM, SCM и другие умные абривиатуры. Сервисы Совместная разработка, онлайн-офис, agile инструменты. Игры Сервера массовых многопользовательских онлайн-игр.
  • 4. Когда? ● Обилие бизнес-процессов Не CRUD приложение. ● Доступ к эксперту в предметной области Skype'а может быть не достаточно. ● Квалифицированная команда Умение применять: шаблоны проектирования; модульные тесты; CI.
  • 5. Symfony 2 как основа для DDD приложения ● Контейнер зависимостей Принцип инверсии зависимостей — ключевой элемент хорошей архитектуры ● Doctrine ORM DataMapper, Events, Table Inheritance ● Множество готовых абстракций EventDispatcher, Form, Request, User ● Сообщество FOSRestBundle, JMSSerializer, NelmioApiDocBundle
  • 6. Каноничный подход к архитектуре Symfony 2 приложения ● Бандлы как готовое приложение Бизнес-правила связаны с фреймворком? ● Анемичная доменная модель Объекты без поведения. Структуры? ● Бизнес-логика в сервисах Объекты без ограничения ответственности? ● «Жесткая» конфигурация DIC Нет параметров. Не используются alias. Почему так? KISS!
  • 7. Каноничный подход к архитектуре Symfony 2 приложения Бандлы как готовое приложение
  • 8. DDD подход к архитектуре Symfony 2 приложения Бандлы как средство интеграции Бандл предоставляет реализации интерфейсов домена в рамках текущего приложения.
  • 9. DDD подход к архитектуре Symfony 2 приложения Бандлы как средство интеграции Doctrine ORM не умеет связывать (пока) объекты значения. Решение: ● ● ● Использовать lifecycle callbacks; PostLoad — для десериализации столбцов базы в объект-значение PrePersist и PreUpdate — для сериализации объекта
  • 10. Каноничный подход к архитектуре Symfony 2 приложения Анемичная доменная модель
  • 11. DDD подход к архитектуре Symfony 2 приложения Насыщенная модель предметной области
  • 12. DDD подход к архитектуре Symfony 2 приложения Насыщенная модель предметной области ● ● Единый язык — наименование объектов и методов домена имеют смысл для эксперта предметной области. Нет get* и set* методов. Building an Object Model: No setters allowed ● Объекты-значения — свойства, важные в той предметной области, которую вы моделируете. Mathias Verraes: Money ● Сущности защищены от стороннего кода Mathias Verraes: Unbreakable Domain Models
  • 13. Каноничный подход к архитектуре Symfony 2 приложения Бизнес-логика в сервисах Вопрос: где должен быть метод createOrder?
  • 14. DDD подход к архитектуре Symfony 2 приложения Сервисы как посредники между API и доменом *Command классы — DTO для API данных. Метод createOrder теперь располагается только в OrderService.
  • 15. API для DDD приложения ● Отдельный бандл CoreDomain — CoreApiBundle. ● Контроллеры как сервисы Больше гибкости для UI. ● CQRS — разделение моделей чтения и записи Account — AccountView Order — OrderView
  • 16. API для DDD приложения REST — наш выбор! ● Любые клиенты; Браузер, мобильной приложение, телевизор, чайник ... ● Простота реализации; еще проще с FOSRestBundle. ● Документация; NelmioApiDocBundle — поможет!
  • 17. UI для DDD приложения ● Отдельный бандл CoreDomain — CoreViewBundle. ● Формы — это часть UI Формы соответствуют API командам, а не доменным объектам. ● JS MVC — это удобно! Backbone, AngularJS, EmberJS, KnockoutJS.
  • 18. Идеи на будущее ● ● ● ● Doctrine 2.5 — поддержка объектов-значений. Zephir — для доменов со сложной алгоритмикой. DDD Serializer — сериализация в терминах DDD. ???