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

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

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

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

ZF2 contributor
Мои контакты
Email:
kachayev@gmail.com

Twitter:
@kachayev

Facebook:
http://www.facebook.com/kachayev

Github:
https://github.com/kachayev
Мои контакты
Email:
kachayev@gmail.com

Twitter:
@kachayev

Facebook:
http://www.facebook.com/kachayev

Github:
https://github.com/kachayev
О чем мы будем говорить

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):
Спасибо за внимание!



            Вопросы
              ???
Мои контакты
Email:
kachayev@gmail.com

Twitter:
@kachayev

Facebook:
http://www.facebook.com/kachayev

Github:
https://github.com/kachayev

Más contenido relacionado

La actualidad más candente

Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиAvivi Academy
 
Введение в maven
Введение в mavenВведение в maven
Введение в mavenDmitry Zinushin
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEschashnikov
 
Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеAlexander Byndyu
 
Михаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииМихаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииYandex
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингzfconfua
 
управление сборками и развертыванием веб приложений
управление сборками и развертыванием веб приложенийуправление сборками и развертыванием веб приложений
управление сборками и развертыванием веб приложенийSergii Shmarkatiuk
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокDotNetConf
 
Андрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolАндрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolQA Club Minsk
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5SQALab
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDotNetConf
 
Gradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для AndroidGradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для AndroidSQALab
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоDotNetConf
 

La actualidad más candente (17)

Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схеми
 
Введение в maven
Введение в mavenВведение в maven
Введение в maven
 
Java compilers and IDEs
Java compilers and IDEsJava compilers and IDEs
Java compilers and IDEs
 
Эволюция управления зависимостями в коде
Эволюция управления зависимостями в кодеЭволюция управления зависимостями в коде
Эволюция управления зависимостями в коде
 
Михаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииМихаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестировании
 
Методоллогии Agile
Методоллогии AgileМетодоллогии Agile
Методоллогии Agile
 
Dagger 2
Dagger 2Dagger 2
Dagger 2
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
 
управление сборками и развертыванием веб приложений
управление сборками и развертыванием веб приложенийуправление сборками и развертыванием веб приложений
управление сборками и развертыванием веб приложений
 
DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бок
 
Андрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolАндрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation Tool
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
Gradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для AndroidGradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для Android
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешево
 

Similar a DI and Zend Framework (ZFConf2011)

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
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 
Инъекция зависимости и Инверсия Контроля
Инъекция зависимости и Инверсия КонтроляИнъекция зависимости и Инверсия Контроля
Инъекция зависимости и Инверсия КонтроляVladimir Ignatev
 
Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.EatDog
 
Практическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyПрактическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyProvectus
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCOMAQA.BY
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыdmalykhanov
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, ЯндексOntico
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultOleg Mykolaichenko
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектированияksmster
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
Тестирование крупных проектов командой из одного тестировщика
Тестирование крупных проектов командой из одного тестировщика Тестирование крупных проектов командой из одного тестировщика
Тестирование крупных проектов командой из одного тестировщика SQALab
 

Similar a DI and Zend Framework (ZFConf2011) (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. Шкредов С. — Управление зависимостями в архитектуре. Переход о...
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
Инъекция зависимости и Инверсия Контроля
Инъекция зависимости и Инверсия КонтроляИнъекция зависимости и Инверсия Контроля
Инъекция зависимости и Инверсия Контроля
 
Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.Большие проекты, архитектура и фреймворки.
Большие проекты, архитектура и фреймворки.
 
Solid code via tdd
Solid code via tddSolid code via tdd
Solid code via tdd
 
Практическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере RubyПрактическое применение принципа инверсии зависимостей на примере Ruby
Практическое применение принципа инверсии зависимостей на примере Ruby
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышло
 
JEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советыJEE Conf: Архитектура Android приложений: полезные и вредные советы
JEE Conf: Архитектура Android приложений: полезные и вредные советы
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Software Design Patterns
Software Design PatternsSoftware Design Patterns
Software Design Patterns
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
шаблоны проектирования
шаблоны проектированияшаблоны проектирования
шаблоны проектирования
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Тестирование крупных проектов командой из одного тестировщика
Тестирование крупных проектов командой из одного тестировщика Тестирование крупных проектов командой из одного тестировщика
Тестирование крупных проектов командой из одного тестировщика
 

DI and Zend Framework (ZFConf2011)

  • 1. Гибкая архитектура Zend Framework приложений с использованием Dependency Injection
  • 2. Алексей Качаев Senior/Lead PHP Developer at Cogniance 4+ года опыта c PHP 3+ года использования Zend Framework Активный участник zendframework.ru/forum ZF2 contributor
  • 5. О чем мы будем говорить 1. Что такое зависимости 2. IoC в теории и на практике 3. Реализация DI в Zend Framework с использованием Symfony DI Container 4. Антипаттерны, или что мешает управлять зависимостями 5. IoC в Zend Framework 2.0
  • 9. Что такое зависимости: и... Задача на разминку: как тестируя ProfileController заменить DbConnection на фейковый?
  • 10. Что здесь плохого? 1. Жесткость и хрупкость (изменения => поломка) архитектуры (по Роберту Мартину) 2. "Нетестируемость" системы 3. Отсутствие прозрачности связей (сложность) 4. Код не самого нижнего уровня иерархии практически невозможно реиспользовать (монолитность)
  • 11. IoC patterns: теория и практика
  • 12. IoC в теории 1. Принцип Inversion of Control: Модули верхних уровней не должны зависить от модулей нижних уровней. Легко сказать! 2. Реализация на практике: Ответственности за зависимости переходят к классам верхнего уровня.
  • 13. IoC на практике У Фаулера: http://martinfowler.com/articles/injection.html Два основных паттерна: 1. Service Locator 2. Dependency Injection (Внедрение или Инъекция Зависимостей) http://ru.wikipedia.org/wiki/Dependency_Injection (разница в том, на кого перекладывается ответственность за управление зависимостями)
  • 14. Service Locator Суть: зависимостями управляет специальный объект ServiceLocator
  • 15. Service Locator Далее используем везде, где есть зависимости
  • 16. Dependency Injection Суть: зависимый объект заранее передается через setter или конструктор. Зависимости Сборка
  • 17. 3 шага к Dependency Injection Шаг 1. Getter/Setter Шаг 2. Интерфейс (interface) Шаг 3. Контейнер
  • 18. 3 шага к Dependency Injection
  • 20. Идем дальше: игра в пятнашки "Двигаем" все зависимости "наверх" в единый Контейнер:
  • 21. Используем контейнер Контролер создаем не прямо, а через берем из контейнера: Чего еще хотелось бы: - build контейнера из конфигурационного файла - shared-объекты контейнера, для возможности следить за уникальностью объекта в рамках контейнера (при необходимости)
  • 22. Что дает DI? 1. Любой класс в иерархии зависимостей можно отдельно протестировать 2. Код легко перенести в другое окружение и/или приложение 3. Один шаг в сторону принципа единой ответственности класса
  • 23. Сравнение двух подходов с практической точки зрения Service Locator + очень просто внедрить даже в существующий (даже крупный проект) - точечность изменений + легко заложить дефолтные процедуры получения объекта - сложно переопределять объекты DI + более управляемый при сильном разрастании + обеспечивает большую прозрачности иерархий - практически не поддерживает точечного внедрения Возможно использование смешаного подхода
  • 24. ZF 1.* & Symfony DI Container
  • 25. PHP DI контейнеры 1. Symfony Dependency Injection 2. Pico Container 3. Yadif_Container 4. Phemto 5. .... (много других)
  • 26. Возможности Symfony DI 1. Удобное представление контейнера через конфигурацию (xml, yaml) 2. Гибкие возможности конфигуратора 3. Dump собранного контейнера в php-код для увеличения производительности 4. Shared-объекты контейнера 5. Хранение параметров
  • 29. DI в Zend Варианты: - контейнер для Application - контейнер как ресурс - контейнер как часть Bootstrap
  • 30. Как мы поступим? Прим. Очень много зависимостей, на которые мы пока не смотрим (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
  • 32. Service locator helper - использование Плюсы + простота имплементации + легкость "точечного" внедрения Минусы - "частичный" DI - контроллер не является самодостаточным и связан с helper-ом
  • 33. Dependency Injection при диспечирезации 1. В helper-e добавляем функцию preDispatch() - будет вызвана FrontController-ом перед диспечеризацией контроллера 2. Получаем в ней объект контроллера 3. Через Zend_Reflection_Class анализируем свойста и методы, на предмет наличия @Inject аннотации 4. Инъектируем зависимости (через setter или через рефлекцию)
  • 34. Dependency Injection при диспечирезации Плюсы + те же Минусы - контроллер не является самодостаточным и связан с циклом диспечирезации
  • 35. DI - обратить внимание Негативный момент DI - "привязанность" к inject- ированию. Во избежании проблем лучше пользоваться Exception-ами вроде: Безопаснее - RuntimeException()
  • 36. DI - lazy loading Иногда бывают ситуации, когда нам нужно получить некий объект с "тяжелыми" объектами в иерархии зависимостей. UserService->AuthProvider->AuthAdapter->DbConnection Но DbConnection может не пригодится. Решение - фабрика.
  • 37. DI - unit-тестирование 1. Любой объект может быть собран на любом уровне иерархии зависимостей, а значит может быть протестирован отдельно. 2. Сборка тестируемых объектов может проводится как контейнером (используем тестовый конфиг), так и в "ручном" режиме (используя принцип DI-ready в архитектуре каждого объекта).
  • 38. Антипаттерны IoC: что мешает управлять зависимостями
  • 39. Антипаттерны Не-injectable: 1. Singleton - заменяется на shared-объект в рамках контейнера 2. Static class - отпадает необходимость, так как есть возможность инъектировать объект 3. Cross-reference - объкты ссылаются друг на друга. например Bootstrap->FrontController->Bootstrap
  • 40. Антипаттерны Не-логичные: 4. "Блуждающий контейнер" - зависимости собираются в контейнер, но сам койнейнер передается (injected) вниз по иерархии
  • 42. 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
  • 43. 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 их нет)
  • 44. 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 не позволяет использовать существующие решения.
  • 45. IoC в Zend Framework 2.0 Приведенные в Proposal примеры достаточно искусственны и тривиальны. Типа такого:
  • 46. IoC в Zend Framework 2.0 Что не дает возможности оценить необходимость и выигрыш от смешивания подходов в некий DI based Service Locator (похоже на java-ский Avalon Framework):