Гибкая архитектура Zend  Framework приложений сиспользованием Dependency          Injection
Алексей КачаевSenior/Lead PHP Developer atCogniance4+ года опыта c PHP3+ года использования ZendFrameworkАктивный участник...
О чем мы будем говорить1. Что такое зависимости2. IoC в теории и на практике3. Реализация DI в Zend Framework с использова...
Что такое зависимости     (dependency)
Что такое зависимости: начало
Что такое зависимости: далее
Что такое зависимости: и...Задача на разминку: как тестируя ProfileControllerзаменить DbConnection на фейковый?
Что здесь плохого?1. Жесткость и хрупкость (изменения => поломка)архитектуры (по Роберту Мартину)2. "Нетестируемость" сист...
IoC patterns:теория и практика
IoC в теории1. Принцип Inversion of Control:Модули верхних уровней не должны зависить от модулейнижних уровней.Легко сказа...
IoC на практикеУ Фаулера:http://martinfowler.com/articles/injection.htmlДва основных паттерна:1. Service Locator2. Depende...
Service LocatorСуть: зависимостями управляет специальный объектServiceLocator
Service LocatorДалее используем везде, где есть зависимости
Dependency Injection Суть: зависимый объект заранее передается через setter или конструктор.Зависимости                   ...
3 шага к Dependency InjectionШаг 1. Getter/SetterШаг 2. Интерфейс (interface)Шаг 3. Контейнер
3 шага к Dependency Injection
На один уровень выше
Идем дальше: игра в пятнашки"Двигаем" все зависимости "наверх" в единый Контейнер:
Используем контейнерКонтролер создаем не прямо, а через берем изконтейнера:Чего еще хотелось бы:- build контейнера из конф...
Что дает DI?1. Любой класс в иерархии зависимостей можно отдельнопротестировать2. Код легко перенести в другое окружение и...
Сравнение двух подходов спрактической точки зренияService Locator+ очень просто внедрить даже в существующий (дажекрупный ...
ZF 1.* &Symfony DI Container
PHP DI контейнеры1. Symfony Dependency Injection2. Pico Container3. Yadif_Container4. Phemto5. .... (много других)
Возможности Symfony DI1. Удобное представление контейнера черезконфигурацию (xml, yaml)2. Гибкие возможности конфигуратора...
Пример блоков конфигурации
Пример блоков конфигурации
DI в ZendВарианты:- контейнер для Application- контейнер как ресурс- контейнер как часть Bootstrap
Как мы поступим?Прим. Очень много зависимостей, на которые мы пока несмотрим (helpers, plugins, View, request/response и т...
Service locator helper
Service locator helper - использованиеПлюсы+ простота имплементации+ легкость "точечного" внедренияМинусы- "частичный" DI ...
Dependency Injection придиспечирезации1. В helper-e добавляем функцию preDispatch() - будетвызвана FrontController-ом пере...
Dependency Injection придиспечирезацииПлюсы + те жеМинусы- контроллер не является самодостаточным и связан сциклом диспечи...
DI - обратить вниманиеНегативный момент DI - "привязанность" к inject-ированию. Во избежании проблем лучше пользоватьсяExc...
DI - lazy loadingИногда бывают ситуации, когда нам нужно получитьнекий объект с "тяжелыми" объектами в иерархиизависимосте...
DI - unit-тестирование1. Любой объект может быть собран на любом уровнеиерархии зависимостей, а значит может бытьпротестир...
Антипаттерны IoC:что мешает управлять   зависимостями
АнтипаттерныНе-injectable:1. Singleton- заменяется на shared-объект в рамках контейнера2. Static class- отпадает необходим...
АнтипаттерныНе-логичные:4. "Блуждающий контейнер"- зависимости собираются в контейнер, но сам койнейнерпередается (injecte...
IoC & ZF2
IoC в Zend Framework2007 годZend_Di component proposal (Federico Cargnelutti)http://framework.zend.com/wiki/display/ZFPROP...
IoC в Zend Framework 2.0Matthew Weier OPhinney"Zend Framework 2 Patterns"Roadmap...- ...- Inversion of Control1. Service L...
IoC в Zend Framework 2.010 Марта, 2011Proposal for ServiceLocator and DependencyInjector(http://framework.zend.com/wiki/di...
IoC в Zend Framework 2.0Приведенные в Proposal примеры достаточноискусственны и тривиальны.Типа такого:
IoC в Zend Framework 2.0Что не дает возможности оценить необходимость ивыигрыш от смешивания подходов в некий DI basedServ...
Спасибо за внимание!            Вопросы              ???
Upcoming SlideShare
Loading in …5
×

ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием Dependency Injection (Алексей Качаев)

2,653 views
2,557 views

Published on

1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
2,653
On SlideShare
0
From Embeds
0
Number of Embeds
1,248
Actions
Shares
0
Downloads
0
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием Dependency Injection (Алексей Качаев)

  1. 1. Гибкая архитектура Zend Framework приложений сиспользованием Dependency Injection
  2. 2. Алексей КачаевSenior/Lead PHP Developer atCogniance4+ года опыта c PHP3+ года использования ZendFrameworkАктивный участникzendframework.ru/forumZF2 contributor
  3. 3. О чем мы будем говорить1. Что такое зависимости2. IoC в теории и на практике3. Реализация DI в Zend Framework с использованиемSymfony DI Container4. Антипаттерны, или что мешает управлятьзависимостями5. IoC в Zend Framework 2.0
  4. 4. Что такое зависимости (dependency)
  5. 5. Что такое зависимости: начало
  6. 6. Что такое зависимости: далее
  7. 7. Что такое зависимости: и...Задача на разминку: как тестируя ProfileControllerзаменить DbConnection на фейковый?
  8. 8. Что здесь плохого?1. Жесткость и хрупкость (изменения => поломка)архитектуры (по Роберту Мартину)2. "Нетестируемость" системы3. Отсутствие прозрачности связей (сложность)4. Код не самого нижнего уровня иерархии практическиневозможно реиспользовать (монолитность)
  9. 9. IoC patterns:теория и практика
  10. 10. IoC в теории1. Принцип Inversion of Control:Модули верхних уровней не должны зависить от модулейнижних уровней.Легко сказать!2. Реализация на практике:Ответственности за зависимости переходят к классамверхнего уровня.
  11. 11. IoC на практикеУ Фаулера:http://martinfowler.com/articles/injection.htmlДва основных паттерна:1. Service Locator2. Dependency Injection (Внедрение или ИнъекцияЗависимостей)http://ru.wikipedia.org/wiki/Dependency_Injection(разница в том, на кого перекладывается ответственностьза управление зависимостями)
  12. 12. Service LocatorСуть: зависимостями управляет специальный объектServiceLocator
  13. 13. Service LocatorДалее используем везде, где есть зависимости
  14. 14. Dependency Injection Суть: зависимый объект заранее передается через setter или конструктор.Зависимости Сборка
  15. 15. 3 шага к Dependency InjectionШаг 1. Getter/SetterШаг 2. Интерфейс (interface)Шаг 3. Контейнер
  16. 16. 3 шага к Dependency Injection
  17. 17. На один уровень выше
  18. 18. Идем дальше: игра в пятнашки"Двигаем" все зависимости "наверх" в единый Контейнер:
  19. 19. Используем контейнерКонтролер создаем не прямо, а через берем изконтейнера:Чего еще хотелось бы:- build контейнера из конфигурационного файла- shared-объекты контейнера, для возможности следитьза уникальностью объекта в рамках контейнера (принеобходимости)
  20. 20. Что дает DI?1. Любой класс в иерархии зависимостей можно отдельнопротестировать2. Код легко перенести в другое окружение и/илиприложение3. Один шаг в сторону принципа единой ответственностикласса
  21. 21. Сравнение двух подходов спрактической точки зренияService Locator+ очень просто внедрить даже в существующий (дажекрупный проект) - точечность изменений+ легко заложить дефолтные процедуры полученияобъекта- сложно переопределять объектыDI+ более управляемый при сильном разрастании+ обеспечивает большую прозрачности иерархий- практически не поддерживает точечного внедренияВозможно использование смешаного подхода
  22. 22. ZF 1.* &Symfony DI Container
  23. 23. PHP DI контейнеры1. Symfony Dependency Injection2. Pico Container3. Yadif_Container4. Phemto5. .... (много других)
  24. 24. Возможности Symfony DI1. Удобное представление контейнера черезконфигурацию (xml, yaml)2. Гибкие возможности конфигуратора3. Dump собранного контейнера в php-код для увеличенияпроизводительности4. Shared-объекты контейнера5. Хранение параметров
  25. 25. Пример блоков конфигурации
  26. 26. Пример блоков конфигурации
  27. 27. DI в ZendВарианты:- контейнер для Application- контейнер как ресурс- контейнер как часть Bootstrap
  28. 28. Как мы поступим?Прим. Очень много зависимостей, на которые мы пока несмотрим (helpers, plugins, View, request/response и т.д.)1. Контейнер будет внедрен в Bootstrap вместостандартного Zend_Registry2. В контролере, контейнер можно будет получить черезспециальный Helper - ServiceContainerЭто идеологически Service Locator.3. PreDispatch-обработка инъекций (ServiceContainerhelper)Sourceshttps://github.com/kachayev/zfconf-speech
  29. 29. Service locator helper
  30. 30. Service locator helper - использованиеПлюсы+ простота имплементации+ легкость "точечного" внедренияМинусы- "частичный" DI - контроллер не являетсясамодостаточным и связан с helper-ом
  31. 31. Dependency Injection придиспечирезации1. В helper-e добавляем функцию preDispatch() - будетвызвана FrontController-ом перед диспечеризациейконтроллера2. Получаем в ней объект контроллера3. Через Zend_Reflection_Class анализируем свойста иметоды, на предмет наличия @Inject аннотации4. Инъектируем зависимости (через setter или черезрефлекцию)
  32. 32. Dependency Injection придиспечирезацииПлюсы + те жеМинусы- контроллер не является самодостаточным и связан сциклом диспечирезации
  33. 33. DI - обратить вниманиеНегативный момент DI - "привязанность" к inject-ированию. Во избежании проблем лучше пользоватьсяException-ами вроде:Безопаснее - RuntimeException()
  34. 34. DI - lazy loadingИногда бывают ситуации, когда нам нужно получитьнекий объект с "тяжелыми" объектами в иерархиизависимостей.UserService->AuthProvider->AuthAdapter->DbConnectionНо DbConnection может не пригодится. Решение -фабрика.
  35. 35. DI - unit-тестирование1. Любой объект может быть собран на любом уровнеиерархии зависимостей, а значит может бытьпротестирован отдельно.2. Сборка тестируемых объектов может проводится какконтейнером (используем тестовый конфиг), так и в"ручном" режиме (используя принцип DI-ready вархитектуре каждого объекта).
  36. 36. Антипаттерны IoC:что мешает управлять зависимостями
  37. 37. АнтипаттерныНе-injectable:1. Singleton- заменяется на shared-объект в рамках контейнера2. Static class- отпадает необходимость, так как есть возможностьинъектировать объект3. Cross-reference- объкты ссылаются друг на друга. напримерBootstrap->FrontController->Bootstrap
  38. 38. АнтипаттерныНе-логичные:4. "Блуждающий контейнер"- зависимости собираются в контейнер, но сам койнейнерпередается (injected) вниз по иерархии
  39. 39. IoC & ZF2
  40. 40. IoC в Zend Framework2007 годZend_Di component proposal (Federico Cargnelutti)http://framework.zend.com/wiki/display/ZFPROP/Zend_Di+-+Federico+CargneluttiНепринято из-за комплексности2008 годZend_Container component proposal (Bradley Holt)http://framework.zend.com/wiki/display/ZFPROP/Zend_Container+-+Bradley+Holt
  41. 41. IoC в Zend Framework 2.0Matthew Weier OPhinney"Zend Framework 2 Patterns"Roadmap...- ...- Inversion of Control1. Service Locator2. Dependency Injector(в официальном ZF 2.0 Roadmap их нет)
  42. 42. IoC в Zend Framework 2.010 Марта, 2011Proposal for ServiceLocator and DependencyInjector(http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+ServiceLocator+and+DependencyInjector)Пример использования новых компонентовhttps://github.com/weierophinney/zf-examples/tree/projects%2Fzf2.di/zf2-diВызвало достаточно бурное обсуждение в рассылкеконтрибьюторов.Замечание: лицензия ZF не позволяет использоватьсуществующие решения.
  43. 43. IoC в Zend Framework 2.0Приведенные в Proposal примеры достаточноискусственны и тривиальны.Типа такого:
  44. 44. IoC в Zend Framework 2.0Что не дает возможности оценить необходимость ивыигрыш от смешивания подходов в некий DI basedService Locator (похоже на java-ский Avalon Framework):
  45. 45. Спасибо за внимание! Вопросы ???

×