$30 off During Our Annual Pro Sale. View Details »

Izhevsk PHP Meetup #1. Неприметный аспект. Введение в AOP

Izhevsk PHP Meetup #1. Неприметный аспект. Введение в AOP

Дмитрий Кораблинов, ведущий разработчик, Kiwitaxi
Поговорим об основах аспектно-ориентированного программирования:
• выявим ситуации, в которых АОП может быть полезным
• рассмотрим примеры реализации с использованием Go! AOP PHP
• заглянем "под капот" этой библиотеки, чтобы выяснить, как это вообще работает

Izhevsk PHP Meetup

December 08, 2016
Tweet

More Decks by Izhevsk PHP Meetup

Other Decks in Technology

Transcript

  1. Неприметный аспект
    Введение в AOP
    Дмитрий Кораблинов
    ведущий разработчик, Kiwitaxi

    View Slide

  2. Аспектно-ориентированное программирование
    2

    View Slide

  3. Архитектура AOP
    3
    Aspect
    Advice
    Advice
    Advice
    Method
    Class
    Pointcut
    Pointcut
    Class
    Class

    View Slide

  4. Задачи для AOP
    Логирование
    Кеширование
    Проверка прав доступа
    Управление транзакциями
    Контракты
    etc
    4

    View Slide

  5. AOP в PHP
    Go! AOP Framework https://github.com/goaop/framework
    JMSAopBundle https://github.com/schmittjoh/JMSAopBundle
    AOP Pecl package https://pecl.php.net/package/AOP
    Exar Framework https://github.com/techdev-solutions/exar-framework
    5

    View Slide

  6. Пример: кэширование
    class DataProvider
    {
    /** @var CacheItemPoolInterface */
    private $cacheItemPool;
    public function getData()
    {
    $cacheKey = md5(__METHOD__);
    $cacheItem = $this->cacheItemPool->getItem($cacheKey);
    if ($cacheItem->isHit()) {
    return $cacheItem->get();
    }
    $data = [1,2,3];
    $cacheItem->set($data)->expiresAfter(3600);
    $this->cacheItemPool->save($cacheItem);
    return $data;
    }
    }
    6

    View Slide

  7. Go! AOP Framework: Aspect class
    class CachingAspect implements Aspect
    {
    /** @var CacheItemPoolInterface */
    private $cacheItemPool;
    /** @Around("@annotation(Annotation\Cacheable)") */
    public function aroundCacheable(MethodInvocation $invocation)
    {
    $cacheKey = md5(get_class($invocation->getThis()) . $invocation->getMethod()->name);
    $cacheItem = $this->cacheItemPool->getItem($cacheKey);
    if ($cacheItem->isHit()) {
    return $cacheItem->get();
    }
    $data = $invocation->proceed();
    $cacheItem->set($data)->expiresAfter(
    $invocation->getMethod()->getAnnotation('Annotation\Cacheable')->lifetime
    );
    $this->cacheItemPool->save($cacheItem);
    return $data;
    }
    }
    7

    View Slide

  8. Go! AOP Framework: App class
    class DataProvider
    {
    /** @Annotation\Cacheable(lifetime=3600) */
    public function getData()
    {
    $data = [1,2,3];
    return $data;
    }
    }
    8

    View Slide

  9. Go! AOP Framework: под капотом
    Перехват autoloading
    Кодогенерация
    Profit! Или нет?
    9

    View Slide

  10. Спасибо! Ваши вопросы?
    10
    Дмитрий Кораблинов
    ведущий разработчик, Kiwitaxi
    Email: [email protected]
    Skype: dmitriy_korablinov

    View Slide