SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
Чуть сложнее
чем 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

Más contenido relacionado

La actualidad más candente

занятие 2
занятие 2занятие 2
занятие 2ajantis
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiAlexander Makarov
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2Alexander 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
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...DevDay
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, WambaOntico
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 
Lecture5
Lecture5Lecture5
Lecture5orgil
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 

La actualidad más candente (19)

занятие 2
занятие 2занятие 2
занятие 2
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
UWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем YiiUWDC 2013, Как мы используем Yii
UWDC 2013, Как мы используем Yii
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2DevConf 2012 - Yii, его разработка и Yii2
DevConf 2012 - Yii, его разработка и Yii2
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
 
Squeek School #7
Squeek School #7Squeek School #7
Squeek School #7
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
Lecture5
Lecture5Lecture5
Lecture5
 
Yii development
Yii developmentYii development
Yii development
 

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

Чуть сложнее чем 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 FrameworkGeorgy Turevich
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA 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 AutomationAndrii Dzynia
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
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
 

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

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Устройство фреймворка 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 родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
бегун
бегунбегун
бегун
 
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
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 
бегун
бегунбегун
бегун
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 

Más de zfconfua

Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0zfconfua
 
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 2zfconfua
 
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...
Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социал...zfconfua
 
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0zfconfua
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингzfconfua
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0zfconfua
 

Más de zfconfua (8)

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

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