ݺߣ

ݺߣShare a Scribd company logo
Чуть сложнее
чем Singleton
Аннотации, IoC, АОП
Kirill chEbba Chebunin
• Аннотации, IoC, АОП
• АОП через IoC + аннотации
• Далеко не новые технологии
• В PHP мало используются
О докладе
1. Аннотации
@Entity
public class User {/**/}
[Class]
public class User {/**/}
/** @Entity */
class User {/**/}
Аннотации
• Метаданные, описывающие классы,
методы, свойства
• Компромисс между «соглашениями» и
«конфигурацией»
• Конфигурация непосредственно в коде
Аннотации
PHPUnit – возможно, одна из первых
билиотек с использованием аннотаций.
/**
* @expectedException RuntimeException
*/
public function testException()
{
}
Аннотации. Аннотации в PHP
Zend_Reflection – чтение PHPDoc тегов.
$class = new Zend_Reflection_Class(
'MyClass'
);
$docBlock = $class->getDocblock();
$tag = $docBlock->getTag('myTag');
echo $tag->getDescription();
Аннотации. Аннотации в PHP
И, конечно, Doctrine 2
/** @Entity */
class MyPersistentClass
{
/** @Column(type="integer") */
private $id;
/** @Column(length=50) */
private $name; // type defaults to string
//...
}
Аннотации. Аннотации в PHP
$reader = new AnnotationReader();
$reader->setDefaultAnnotationNamespace(
'DoctrineORMMapping‘
);
$entity = $reader->getClassAnnotation(
'MyPersistentClass',
'DoctrineORMMappingEntity'
);
if ($entity !== null) {
//Entity! Do smth
}
Аннотации. Аннотации в PHP
Можно использовать в ActionHelper’ах.
•ContextSwitch (AjaxContext)
•Cache
Аннотации. Аннотации в ZF
/** @ContextSwitchable */
class FooController extends
Zend_Controller_Action
{
/** @Context({"xml", "json"}) */
public function barAction()
{
// Do smth
}
}
Аннотации. Аннотации в ZF
/** @PageCache(tags={"foo", "bar"}) */
public function barAction()
{
// Do smth
}
Аннотации. Аннотации в ZF
2. IoC
Что же такое зависимости?
class FooController
extends Zend_Controller_Action
{
public function barAction()
{
$service = new MyUserService();
$service->getUser(1);
}
}
IoC. Зависимости
Шаг 1. Берем готовый объект из хранилища.
•Service Locator
•Registry
•etc
IoC. Контейнер
// Zend_Registry
$service =
Zend_Registry::get('userService');
// Bootstrap container
$service = $this->getInvokeArg('bootstrap')
->getResource('userService');
IoC. Контейнер
Шаг 2. Используем интерфейсы.
interface UserService
{/**/}
class MyUserService implements UserService
{/**/}
IoC. Интерфейсы наше все
interface UserService
{
public function getUser($id);
}
IoC. Интерфейсы наше все
class MyUserService implements UserService
{
protected $userDao;
public function __construct(UserDao $userDao)
{
$this->userDao = $userDao;
}
public function getUser($id)
{
$this->userDao->getUserById($id);
}
}
IoC. Интерфейсы наше все
• Класс прдоставляет метод/свойство для
инъекции (внедрения) зависимости.
• Внедрением занимается вышестоящий
компонент
IoC. Dependency Injection
protected $userService;
public function setUserService(
UserService $userService)
{
$this->userService = $userService;
}
public function barAction()
{
$this->userService->getUser(1);
}
IoC. Dependency Injection
•Кто же будет заниматься внедрением?
•Как просто конфигурировать зависимости?
IoC. Dependency Injection
• Специальные IoC контерйнеры.
• Для PHP Symfony Dependency Injection
• Есть версия для 5.+
• Есть версия для 5.3
IoC. Symfony DI
• Контейнер содержит описание объектов.
• ZF2 - LazyLoadingBroker
IoC. Symfony DI
<service id="userDao" class="NotMyUserDao">
<!-- Some DB params for example -->
</service>
<service id="userService" class="MyUserService">
<argument type="service" id="userDao"/>
</service>
IoC. Symfony DI
$container = new ContainerBuilder();
$loader = new XmlFileLoader($container);
$loader->load('path/container.xml');
/* @var $service UserService */
$service = $container->get('userService');
IoC. Symfony DI
Можно подменить контейнер.
$application->getBootstrap()
->setContainer($container);
$application->bootstrap()->run();
IoC. ZF + Symfony DI
А можно запустить непосредственно
ФронтКонтроллер.
$front = $container->get('frontController');
$front->dispatch();
IoC. ZF + Symfony DI
Объекты, создаваемые ZF автоматически
•Контроллеры
•ActionHelper’ы
•ViewHerlper’ы
•Плагины
IoC. ZF + Symfony DI. Проблемы
ZF 1.x
•ActionHelper для инъекции в контроллеры
•Реализация Dispatcher’а
•Наследование Zend_Controller_Action
•Наследование Zend_View
IoC. ZF + Symfony DI. Решения
ZF 2.x
•ActionHelper для инъекции в контроллеры
•Реализация PluginLoader’a
•Dispatcher через PluginLoader
IoC. ZF + Symfony DI. Решения
3. АОП
• Прадигма программирования
• Сквозная функциональность
Лог, обработка ошибок, права доступа, транзакции.
• Первая реализация - AspectJ
АОП. Что это?
• JoinPoint (Точка соединения) – метод, которому нужно добавить функциональность
• Pointcut (Срез) – набор JoinPoint’ов
АОП. Основные понятия
/** @Cached */
public function cacheMeDude() {/* */}
/** @Log */
public function plzLogMe() {/* */}
/** @Transactional */
public function iNeedTransaction() {/* */}
АОП. Реализация на PHP
• Aspect (Аспект)
• Advice (Совет)
Before, After, AfterException, AfterReturn, Around
АОП. Что это?
Advice как метод класса.
/** @Around("@annotation(Cached)") */
public function cache(
ProceedingJoinPoint $joinPoint)
{
// Cache result or return from cache
}
АОП. Что это?
Изменить работу метода, не трогая готовый
код.
•Переопределение в рантайме (runkit, etc)
•«Предкомпилирование» кода
•Прокси классы
АОП. Реализация на PHP
Подмена объекта, прокси объектом.
Например, при создании в IoC контейнере.
$objectProxy =
ProxyClass::createProxyFromObject(
$object,
$handler
);
АОП. Реализация на PHP
Генерируем прокси-классы с помощью
Zend_CodeGenerator
class TestAOPCheProxy extends TestAOP
{
// Override all methods
}
АОП. Реализация на PHP
Override всех public и protected методов
public function method($foo, $bar)
{
return $this->invocationHandler->invoke(
$this,
new ReflectionMethod(
get_parent_class(__CLASS__),
__FUNCTION__
),
func_get_args()
);
}
АОП. Реализация на PHP
/** @Cached */
public function cacheMeDude() {/* */}
/** @Log */
public function plzLogMe() {/* */}
/** @Transactional */
public function iNeedTransaction() {/* */}
АОП. Реализация на PHP
$aopedObject->cacheMeDude();
•ProxyClass::cacheMeDude();
– Handler::invoke()
• CacheAspect::cache()
–? OriginalClass::cacheMeDude()
АОП. Реализация на PHP
• Не панацея
• Может усложнить систему
• Тестирование
АОП. Заключение
Спасибо за внимание.
Kirill chEbba Chebunin
Email: iam@chebba.org
Twitter: iamchEbba
The End

More Related Content

What's hot (18)

занятие 2
занятие 2занятие 2
занятие 2
ajantis
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
Илья Кожухов
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
Alexander Makarov
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
Alexander Makarov
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Fedor Malyshkin
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
Paul Stashevsky
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
DevDay
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
Igor Shkulipa
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
занятие 2
занятие 2занятие 2
занятие 2
ajantis
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
Alexander Makarov
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
Alexander Makarov
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Fedor Malyshkin
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
Paul Stashevsky
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
DevDay
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
Igor Shkulipa
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov

Similar to Чуть сложнее чем Singleton: аннотации, IOC, АОП (20)

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Александр Егурцов
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
Yura Bogdanov
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
private_face
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Ontico
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
Sergey Skvortsov
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
Magecom Ukraine
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
Igor Shkulipa
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Александр Егурцов
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
Yura Bogdanov
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
private_face
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Ontico
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
Sergey Skvortsov
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
Magecom Ukraine
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
Igor Shkulipa

More from zfconfua (8)

Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)
zfconfua
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)
zfconfua
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
zfconfua
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
zfconfua
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
zfconfua
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
zfconfua
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)NoSQL и Zend Framework (Никита Грошин)
NoSQL и Zend Framework (Никита Грошин)
zfconfua
NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)NoSQL и Zend Framework (Ростислав Михайлив)
NoSQL и Zend Framework (Ростислав Михайлив)
zfconfua
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
zfconfua
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
zfconfua
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
zfconfua

Чуть сложнее чем Singleton: аннотации, IOC, АОП