SlideShare una empresa de Scribd logo
1 de 45
Гибкая архитектура Zend
  Framework приложений с
использованием Dependency
          Injection
Алексей Качаев
Senior/Lead PHP Developer at
Cogniance

4+ года опыта c PHP

3+ года использования Zend
Framework

Активный участник
zendframework.ru/forum

ZF2 contributor
О чем мы будем говорить

1. Что такое зависимости

2. IoC в теории и на практике

3. Реализация DI в Zend Framework с использованием
Symfony DI Container

4. Антипаттерны, или что мешает управлять
зависимостями

5. IoC в Zend Framework 2.0
Что такое зависимости
     (dependency)
Что такое зависимости: начало
Что такое зависимости: далее
Что такое зависимости: и...




Задача на разминку: как тестируя ProfileController
заменить DbConnection на фейковый?
Что здесь плохого?

1. Жесткость и хрупкость (изменения => поломка)
архитектуры (по Роберту Мартину)

2. "Нетестируемость" системы

3. Отсутствие прозрачности связей (сложность)

4. Код не самого нижнего уровня иерархии практически
невозможно реиспользовать (монолитность)
IoC patterns:
теория и практика
IoC в теории

1. Принцип Inversion of Control:

Модули верхних уровней не должны зависить от модулей
нижних уровней.

Легко сказать!

2. Реализация на практике:

Ответственности за зависимости переходят к классам
верхнего уровня.
IoC на практике

У Фаулера:
http://martinfowler.com/articles/injection.html

Два основных паттерна:

1. Service Locator

2. Dependency Injection (Внедрение или Инъекция
Зависимостей)
http://ru.wikipedia.org/wiki/Dependency_Injection

(разница в том, на кого перекладывается ответственность
за управление зависимостями)
Service Locator

Суть: зависимостями управляет специальный объект
ServiceLocator
Service Locator

Далее используем везде, где есть зависимости
Dependency Injection
 Суть: зависимый объект заранее передается через setter
 или конструктор.

Зависимости




                                               Сборка
3 шага к Dependency Injection

Шаг 1. Getter/Setter

Шаг 2. Интерфейс (interface)

Шаг 3. Контейнер
3 шага к Dependency Injection
На один уровень выше
Идем дальше: игра в пятнашки

"Двигаем" все зависимости "наверх" в единый Контейнер:
Используем контейнер
Контролер создаем не прямо, а через берем из
контейнера:




Чего еще хотелось бы:

- build контейнера из конфигурационного файла

- shared-объекты контейнера, для возможности следить
за уникальностью объекта в рамках контейнера (при
необходимости)
Что дает DI?

1. Любой класс в иерархии зависимостей можно отдельно
протестировать

2. Код легко перенести в другое окружение и/или
приложение

3. Один шаг в сторону принципа единой ответственности
класса
Сравнение двух подходов с
практической точки зрения
Service Locator
+ очень просто внедрить даже в существующий (даже
крупный проект) - точечность изменений
+ легко заложить дефолтные процедуры получения
объекта
- сложно переопределять объекты

DI
+ более управляемый при сильном разрастании
+ обеспечивает большую прозрачности иерархий
- практически не поддерживает точечного внедрения

Возможно использование смешаного подхода
ZF 1.* &
Symfony DI Container
PHP DI контейнеры

1. Symfony Dependency Injection
2. Pico Container
3. Yadif_Container
4. Phemto
5. .... (много других)
Возможности Symfony DI

1. Удобное представление контейнера через
конфигурацию (xml, yaml)

2. Гибкие возможности конфигуратора

3. Dump собранного контейнера в php-код для увеличения
производительности

4. Shared-объекты контейнера

5. Хранение параметров
Пример блоков конфигурации
Пример блоков конфигурации
DI в Zend
Варианты:
- контейнер для Application
- контейнер как ресурс
- контейнер как часть Bootstrap
Как мы поступим?
Прим. Очень много зависимостей, на которые мы пока не
смотрим (helpers, plugins, View, request/response и т.д.)

1. Контейнер будет внедрен в Bootstrap вместо
стандартного Zend_Registry

2. В контролере, контейнер можно будет получить через
специальный Helper - ServiceContainer
Это идеологически Service Locator.

3. PreDispatch-обработка инъекций (ServiceContainer
helper)

Sources
https://github.com/kachayev/zfconf-speech
Service locator helper
Service locator helper - использование




Плюсы
+ простота имплементации
+ легкость "точечного" внедрения

Минусы
- "частичный" DI - контроллер не является
самодостаточным и связан с helper-ом
Dependency Injection при
диспечирезации
1. В helper-e добавляем функцию preDispatch() - будет
вызвана FrontController-ом перед диспечеризацией
контроллера

2. Получаем в ней объект контроллера

3. Через Zend_Reflection_Class анализируем свойста и
методы, на предмет наличия @Inject аннотации

4. Инъектируем зависимости (через setter или через
рефлекцию)
Dependency Injection при
диспечирезации




Плюсы + те же
Минусы
- контроллер не является самодостаточным и связан с
циклом диспечирезации
DI - обратить внимание

Негативный момент DI - "привязанность" к inject-
ированию. Во избежании проблем лучше пользоваться
Exception-ами вроде:




Безопаснее - RuntimeException()
DI - lazy loading
Иногда бывают ситуации, когда нам нужно получить
некий объект с "тяжелыми" объектами в иерархии
зависимостей.

UserService->AuthProvider->AuthAdapter->DbConnection

Но DbConnection может не пригодится. Решение -
фабрика.
DI - unit-тестирование

1. Любой объект может быть собран на любом уровне
иерархии зависимостей, а значит может быть
протестирован отдельно.

2. Сборка тестируемых объектов может проводится как
контейнером (используем тестовый конфиг), так и в
"ручном" режиме (используя принцип DI-ready в
архитектуре каждого объекта).
Антипаттерны IoC:
что мешает управлять
   зависимостями
Антипаттерны
Не-injectable:

1. Singleton
- заменяется на shared-объект в рамках контейнера

2. Static class
- отпадает необходимость, так как есть возможность
инъектировать объект

3. Cross-reference
- объкты ссылаются друг на друга. например
Bootstrap->FrontController->Bootstrap
Антипаттерны
Не-логичные:

4. "Блуждающий контейнер"
- зависимости собираются в контейнер, но сам койнейнер
передается (injected) вниз по иерархии
IoC & ZF2
IoC в Zend Framework

2007 год

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
IoC в Zend Framework 2.0

Matthew Weier O'Phinney
"Zend Framework 2 Patterns"

Roadmap...
- ...
- Inversion of Control

1. Service Locator
2. Dependency Injector

(в официальном ZF 2.0 Roadmap их нет)
IoC в Zend Framework 2.0

10 Марта, 2011

Proposal for ServiceLocator and DependencyInjector
(http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+ServiceLocator+and+Dep
endencyInjector)

Пример использования новых компонентов
https://github.com/weierophinney/zf-examples/tree/projects%2Fzf2.di/zf2-di

Вызвало достаточно бурное обсуждение в рассылке
контрибьюторов.

Замечание: лицензия ZF не позволяет использовать
существующие решения.
IoC в Zend Framework 2.0

Приведенные в Proposal примеры достаточно
искусственны и тривиальны.

Типа такого:
IoC в Zend Framework 2.0

Что не дает возможности оценить необходимость и
выигрыш от смешивания подходов в некий DI based
Service Locator (похоже на java-ский Avalon Framework):
Спасибо за внимание!



            Вопросы
              ???

Más contenido relacionado

La actualidad más candente

Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиAvivi Academy
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEschashnikov
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...CocoaHeads
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
Unit tests & tdd in web development
Unit tests & tdd in web developmentUnit tests & tdd in web development
Unit tests & tdd in web developmentAndrey Kucherenko
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Noveo
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокDotNetConf
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Noveo
 

La actualidad más candente (11)

Методоллогии Agile
Методоллогии AgileМетодоллогии Agile
Методоллогии Agile
 
Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схеми
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
Roslyn Code Analysis
Roslyn Code AnalysisRoslyn Code Analysis
Roslyn Code Analysis
 
Unit tests & tdd in web development
Unit tests & tdd in web developmentUnit tests & tdd in web development
Unit tests & tdd in web development
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бок
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)
 

Destacado

ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf Conference
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
Plan de igualdad_ikea
Plan de igualdad_ikeaPlan de igualdad_ikea
Plan de igualdad_ikeaoscargaliza
 
Acta c.i. 12_enero_2011_logo
Acta c.i. 12_enero_2011_logoActa c.i. 12_enero_2011_logo
Acta c.i. 12_enero_2011_logooscargaliza
 
Comision negociadora convenio champion
Comision negociadora convenio championComision negociadora convenio champion
Comision negociadora convenio championoscargaliza
 
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...Kalle
 
02.12.2012 ubuntu 12.1 server guide
02.12.2012 ubuntu 12.1 server guide02.12.2012 ubuntu 12.1 server guide
02.12.2012 ubuntu 12.1 server guideEl Alex Andrade
 
W270 logical fallacies
W270 logical fallaciesW270 logical fallacies
W270 logical fallaciessfboyle
 
Aang Apandi
Aang ApandiAang Apandi
Aang ApandiAANG88
 
Правила и Условия Программы
Правила и Условия ПрограммыПравила и Условия Программы
Правила и Условия ПрограммыAeroSvit Airlines
 
Työmuotojen tukeminen
Työmuotojen tukeminenTyömuotojen tukeminen
Työmuotojen tukeminenMarko Suomi
 
Liu Natural Scene Statistics At Stereo Fixations
Liu Natural Scene Statistics At Stereo FixationsLiu Natural Scene Statistics At Stereo Fixations
Liu Natural Scene Statistics At Stereo FixationsKalle
 
Grindinger Group Wise Similarity And Classification Of Aggregate Scanpaths
Grindinger Group Wise Similarity And Classification Of Aggregate ScanpathsGrindinger Group Wise Similarity And Classification Of Aggregate Scanpaths
Grindinger Group Wise Similarity And Classification Of Aggregate ScanpathsKalle
 

Destacado (19)

ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
Plan de igualdad_ikea
Plan de igualdad_ikeaPlan de igualdad_ikea
Plan de igualdad_ikea
 
Acta c.i. 12_enero_2011_logo
Acta c.i. 12_enero_2011_logoActa c.i. 12_enero_2011_logo
Acta c.i. 12_enero_2011_logo
 
Comision negociadora convenio champion
Comision negociadora convenio championComision negociadora convenio champion
Comision negociadora convenio champion
 
Historia De La Web
Historia De La WebHistoria De La Web
Historia De La Web
 
Vida por vidas
Vida por vidasVida por vidas
Vida por vidas
 
Ftp1989235
Ftp1989235Ftp1989235
Ftp1989235
 
Windmill
WindmillWindmill
Windmill
 
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...
Mc Lendon Using Eye Tracking To Investigate Important Cues For Representative...
 
02.12.2012 ubuntu 12.1 server guide
02.12.2012 ubuntu 12.1 server guide02.12.2012 ubuntu 12.1 server guide
02.12.2012 ubuntu 12.1 server guide
 
Gambling
GamblingGambling
Gambling
 
W270 logical fallacies
W270 logical fallaciesW270 logical fallacies
W270 logical fallacies
 
Aang Apandi
Aang ApandiAang Apandi
Aang Apandi
 
Правила и Условия Программы
Правила и Условия ПрограммыПравила и Условия Программы
Правила и Условия Программы
 
Työmuotojen tukeminen
Työmuotojen tukeminenTyömuotojen tukeminen
Työmuotojen tukeminen
 
Liu Natural Scene Statistics At Stereo Fixations
Liu Natural Scene Statistics At Stereo FixationsLiu Natural Scene Statistics At Stereo Fixations
Liu Natural Scene Statistics At Stereo Fixations
 
นิกิตา ครุสชอฟ
นิกิตา ครุสชอฟนิกิตา ครุสชอฟ
นิกิตา ครุสชอฟ
 
Grindinger Group Wise Similarity And Classification Of Aggregate Scanpaths
Grindinger Group Wise Similarity And Classification Of Aggregate ScanpathsGrindinger Group Wise Similarity And Classification Of Aggregate Scanpaths
Grindinger Group Wise Similarity And Classification Of Aggregate Scanpaths
 

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

Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеAlexander Byndyu
 
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...GeeksLab Odessa
 
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...CodeFest
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASPdevel123
 
Практическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyПрактическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyProvectus
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных системDima Dzuba
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerValeriya Atamanova
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектированияksmster
 
Ciklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionCiklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionPavel Voznenko
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыdmalykhanov
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaLohika_Odessa_TechTalks
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftAnton Loginov
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCOMAQA.BY
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, ЯндексOntico
 

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

Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в коде
 
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...
WebCamp:Back-end Developers Day - Денис Потапов "Простыми словами о 12-фактор...
 
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
CodeFest 2014. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
 
SOLID & GRASP
SOLID & GRASPSOLID & GRASP
SOLID & GRASP
 
Практическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyПрактическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере Ruby
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
Проблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен DaggerПроблемы точечной застройки в больших городах или зачем нужен Dagger
Проблемы точечной застройки в больших городах или зачем нужен Dagger
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектирования
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Ciklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionCiklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency Injection
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советы
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
JavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia RedunovaJavaScript Design Patterns overview by Ksenia Redunova
JavaScript Design Patterns overview by Ksenia Redunova
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
It meetup cd
It meetup cdIt meetup cd
It meetup cd
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышло
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
 
Software Design Patterns
Software Design PatternsSoftware Design Patterns
Software Design Patterns
 
Dagger 2
Dagger 2Dagger 2
Dagger 2
 

Más de ZFConf Conference

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf Conference
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf Conference
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf Conference
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf Conference
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf Conference
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf Conference
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf Conference
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf Conference
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf Conference
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf Conference
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf Conference
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf Conference
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf Conference
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 

Más de ZFConf Conference (20)

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 

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

  • 1. Гибкая архитектура Zend Framework приложений с использованием Dependency Injection
  • 2. Алексей Качаев Senior/Lead PHP Developer at Cogniance 4+ года опыта c PHP 3+ года использования Zend Framework Активный участник zendframework.ru/forum ZF2 contributor
  • 3. О чем мы будем говорить 1. Что такое зависимости 2. IoC в теории и на практике 3. Реализация DI в Zend Framework с использованием Symfony DI Container 4. Антипаттерны, или что мешает управлять зависимостями 5. IoC в Zend Framework 2.0
  • 7. Что такое зависимости: и... Задача на разминку: как тестируя ProfileController заменить DbConnection на фейковый?
  • 8. Что здесь плохого? 1. Жесткость и хрупкость (изменения => поломка) архитектуры (по Роберту Мартину) 2. "Нетестируемость" системы 3. Отсутствие прозрачности связей (сложность) 4. Код не самого нижнего уровня иерархии практически невозможно реиспользовать (монолитность)
  • 9. IoC patterns: теория и практика
  • 10. IoC в теории 1. Принцип Inversion of Control: Модули верхних уровней не должны зависить от модулей нижних уровней. Легко сказать! 2. Реализация на практике: Ответственности за зависимости переходят к классам верхнего уровня.
  • 11. IoC на практике У Фаулера: http://martinfowler.com/articles/injection.html Два основных паттерна: 1. Service Locator 2. Dependency Injection (Внедрение или Инъекция Зависимостей) http://ru.wikipedia.org/wiki/Dependency_Injection (разница в том, на кого перекладывается ответственность за управление зависимостями)
  • 12. Service Locator Суть: зависимостями управляет специальный объект ServiceLocator
  • 13. Service Locator Далее используем везде, где есть зависимости
  • 14. Dependency Injection Суть: зависимый объект заранее передается через setter или конструктор. Зависимости Сборка
  • 15. 3 шага к Dependency Injection Шаг 1. Getter/Setter Шаг 2. Интерфейс (interface) Шаг 3. Контейнер
  • 16. 3 шага к Dependency Injection
  • 18. Идем дальше: игра в пятнашки "Двигаем" все зависимости "наверх" в единый Контейнер:
  • 19. Используем контейнер Контролер создаем не прямо, а через берем из контейнера: Чего еще хотелось бы: - build контейнера из конфигурационного файла - shared-объекты контейнера, для возможности следить за уникальностью объекта в рамках контейнера (при необходимости)
  • 20. Что дает DI? 1. Любой класс в иерархии зависимостей можно отдельно протестировать 2. Код легко перенести в другое окружение и/или приложение 3. Один шаг в сторону принципа единой ответственности класса
  • 21. Сравнение двух подходов с практической точки зрения Service Locator + очень просто внедрить даже в существующий (даже крупный проект) - точечность изменений + легко заложить дефолтные процедуры получения объекта - сложно переопределять объекты DI + более управляемый при сильном разрастании + обеспечивает большую прозрачности иерархий - практически не поддерживает точечного внедрения Возможно использование смешаного подхода
  • 22. ZF 1.* & Symfony DI Container
  • 23. PHP DI контейнеры 1. Symfony Dependency Injection 2. Pico Container 3. Yadif_Container 4. Phemto 5. .... (много других)
  • 24. Возможности Symfony DI 1. Удобное представление контейнера через конфигурацию (xml, yaml) 2. Гибкие возможности конфигуратора 3. Dump собранного контейнера в php-код для увеличения производительности 4. Shared-объекты контейнера 5. Хранение параметров
  • 27. DI в Zend Варианты: - контейнер для Application - контейнер как ресурс - контейнер как часть Bootstrap
  • 28. Как мы поступим? Прим. Очень много зависимостей, на которые мы пока не смотрим (helpers, plugins, View, request/response и т.д.) 1. Контейнер будет внедрен в Bootstrap вместо стандартного Zend_Registry 2. В контролере, контейнер можно будет получить через специальный Helper - ServiceContainer Это идеологически Service Locator. 3. PreDispatch-обработка инъекций (ServiceContainer helper) Sources https://github.com/kachayev/zfconf-speech
  • 30. Service locator helper - использование Плюсы + простота имплементации + легкость "точечного" внедрения Минусы - "частичный" DI - контроллер не является самодостаточным и связан с helper-ом
  • 31. Dependency Injection при диспечирезации 1. В helper-e добавляем функцию preDispatch() - будет вызвана FrontController-ом перед диспечеризацией контроллера 2. Получаем в ней объект контроллера 3. Через Zend_Reflection_Class анализируем свойста и методы, на предмет наличия @Inject аннотации 4. Инъектируем зависимости (через setter или через рефлекцию)
  • 32. Dependency Injection при диспечирезации Плюсы + те же Минусы - контроллер не является самодостаточным и связан с циклом диспечирезации
  • 33. DI - обратить внимание Негативный момент DI - "привязанность" к inject- ированию. Во избежании проблем лучше пользоваться Exception-ами вроде: Безопаснее - RuntimeException()
  • 34. DI - lazy loading Иногда бывают ситуации, когда нам нужно получить некий объект с "тяжелыми" объектами в иерархии зависимостей. UserService->AuthProvider->AuthAdapter->DbConnection Но DbConnection может не пригодится. Решение - фабрика.
  • 35. DI - unit-тестирование 1. Любой объект может быть собран на любом уровне иерархии зависимостей, а значит может быть протестирован отдельно. 2. Сборка тестируемых объектов может проводится как контейнером (используем тестовый конфиг), так и в "ручном" режиме (используя принцип DI-ready в архитектуре каждого объекта).
  • 36. Антипаттерны IoC: что мешает управлять зависимостями
  • 37. Антипаттерны Не-injectable: 1. Singleton - заменяется на shared-объект в рамках контейнера 2. Static class - отпадает необходимость, так как есть возможность инъектировать объект 3. Cross-reference - объкты ссылаются друг на друга. например Bootstrap->FrontController->Bootstrap
  • 38. Антипаттерны Не-логичные: 4. "Блуждающий контейнер" - зависимости собираются в контейнер, но сам койнейнер передается (injected) вниз по иерархии
  • 40. IoC в Zend Framework 2007 год 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. IoC в Zend Framework 2.0 Matthew Weier O'Phinney "Zend Framework 2 Patterns" Roadmap... - ... - Inversion of Control 1. Service Locator 2. Dependency Injector (в официальном ZF 2.0 Roadmap их нет)
  • 42. IoC в Zend Framework 2.0 10 Марта, 2011 Proposal for ServiceLocator and DependencyInjector (http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+ServiceLocator+and+Dep endencyInjector) Пример использования новых компонентов https://github.com/weierophinney/zf-examples/tree/projects%2Fzf2.di/zf2-di Вызвало достаточно бурное обсуждение в рассылке контрибьюторов. Замечание: лицензия ZF не позволяет использовать существующие решения.
  • 43. IoC в Zend Framework 2.0 Приведенные в Proposal примеры достаточно искусственны и тривиальны. Типа такого:
  • 44. IoC в Zend Framework 2.0 Что не дает возможности оценить необходимость и выигрыш от смешивания подходов в некий DI based Service Locator (похоже на java-ский Avalon Framework):