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 {/**/}
Аннотации



• Метаданные, описывающие классы,
  методы, свойства
• Компромисс между «соглашениями» и
  «конфигурацией»
• Конфигурация непосредственно в коде
Аннотации. Аннотации в PHP

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
}
Аннотации. Аннотации в ZF

Можно использовать в 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
}
2. IoC
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. Dependency Injection



• Класс прдоставляет метод/свойство для
  инъекции (внедрения) зависимости.

• Внедрением занимается вышестоящий
  компонент
IoC. Dependency Injection

protected $userService;

public function setUserService(
    UserService $userService)
{
    $this->userService = $userService;
}

public function barAction()
{
    $this->userService->getUser(1);
}
IoC. Dependency Injection




•Кто же будет заниматься внедрением?


•Как просто конфигурировать зависимости?
IoC. Symfony DI

• Специальные 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. ZF + 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
3. АОП
АОП. Что это?

• Прадигма программирования

• Сквозная функциональность
Лог, обработка ошибок, права доступа, транзакции.


• Первая реализация - AspectJ
АОП. Основные понятия



• JoinPoint (Точка соединения) – метод, которому нужно добавить функциональность

• Pointcut (Срез) – набор JoinPoint’ов
АОП. Реализация на PHP



/** @Cached */
public function cacheMeDude() {/* */}

/** @Log */
public function plzLogMe() {/* */}

/** @Transactional */
public function iNeedTransaction() {/* */}
АОП. Что это?



• Aspect (Аспект)


• Advice (Совет)
   Before, After, AfterException, AfterReturn, Around
АОП. Что это?

Advice как метод класса.

/** @Around("@annotation(Cached)") */
public function cache(
    ProceedingJoinPoint $joinPoint)
{
    // Cache result or return from cache
}
АОП. Реализация на PHP

Изменить работу метода, не трогая готовый
код.

•Переопределение в рантайме (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()
АОП. Заключение



• Не панацея

• Может усложнить систему

• Тестирование
The End

Спасибо за внимание.

Kirill chEbba Chebunin
Email: iam@chebba.org
Twitter: iamchEbba

Más contenido relacionado

La actualidad más candente

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 Conference
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
Кирилл Толкачёв
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
BlackFan
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
guest32215a
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
Stepan Tanasiychuk
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 

La actualidad más candente (20)

RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
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
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Coroutines
CoroutinesCoroutines
Coroutines
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 

Destacado

職場見習 1022成果發表-簡單食補—阿翔的故事
職場見習 1022成果發表-簡單食補—阿翔的故事職場見習 1022成果發表-簡單食補—阿翔的故事
職場見習 1022成果發表-簡單食補—阿翔的故事
wawa661
 
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
wawa661
 
Plantracer sl 3
Plantracer sl 3Plantracer sl 3
Plantracer sl 3
amoiseev
 
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...
Kirill Chebunin
 
Masinile romanesti automate de spalat rufe automatic
Masinile romanesti automate de spalat rufe automaticMasinile romanesti automate de spalat rufe automatic
Masinile romanesti automate de spalat rufe automatic
Pápai Zoltán
 

Destacado (15)

職場見習 1022成果發表-簡單食補—阿翔的故事
職場見習 1022成果發表-簡單食補—阿翔的故事職場見習 1022成果發表-簡單食補—阿翔的故事
職場見習 1022成果發表-簡單食補—阿翔的故事
 
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
職場見習 1022成果發表-月台咖啡小館—平溪鄉的十分
 
SPEAK
SPEAKSPEAK
SPEAK
 
EDAD MODERNA 3
EDAD MODERNA 3EDAD MODERNA 3
EDAD MODERNA 3
 
Plantracer sl 3
Plantracer sl 3Plantracer sl 3
Plantracer sl 3
 
Halloween
HalloweenHalloween
Halloween
 
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
 
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...
 
Masinile romanesti automate de spalat rufe automatic
Masinile romanesti automate de spalat rufe automaticMasinile romanesti automate de spalat rufe automatic
Masinile romanesti automate de spalat rufe automatic
 
Limiting the Offshore EPC Contractor's Risks and Liabilities
Limiting the Offshore EPC Contractor's Risks and LiabilitiesLimiting the Offshore EPC Contractor's Risks and Liabilities
Limiting the Offshore EPC Contractor's Risks and Liabilities
 
Dependency management in PHP & ZendFramework 2
Dependency management in PHP & ZendFramework 2Dependency management in PHP & ZendFramework 2
Dependency management in PHP & ZendFramework 2
 
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
Limiting the Offshore EPC Contractor's Risks and Liabiltities, Busan korea 19...
 
Nokia
Nokia Nokia
Nokia
 
Powert point
Powert pointPowert point
Powert point
 
Work design & measurement
Work design & measurementWork design & measurement
Work design & measurement
 

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

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
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
phpdevby
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
Stanfy
 

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

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
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. Родионов Игорь
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
бегун
бегунбегун
бегун
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
 
бегун
бегунбегун
бегун
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 

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

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