4. @Entity
public class User {/**/}
[Class]
public class User {/**/}
/** @Entity */
class User {/**/}
Аннотации
5. • Метаданные, описывающие классы,
методы, свойства
• Компромисс между «соглашениями» и
«конфигурацией»
• Конфигурация непосредственно в коде
Аннотации
6. PHPUnit – возможно, одна из первых
билиотек с использованием аннотаций.
/**
* @expectedException RuntimeException
*/
public function testException()
{
}
Аннотации. Аннотации в PHP
14. Что же такое зависимости?
class FooController
extends Zend_Controller_Action
{
public function barAction()
{
$service = new MyUserService();
$service->getUser(1);
}
}
IoC. Зависимости
15. Шаг 1. Берем готовый объект из хранилища.
•Service Locator
•Registry
•etc
IoC. Контейнер
19. class MyUserService implements UserService
{
protected $userDao;
public function __construct(UserDao $userDao)
{
$this->userDao = $userDao;
}
public function getUser($id)
{
$this->userDao->getUserById($id);
}
}
IoC. Интерфейсы наше все
20. • Класс прдоставляет метод/свойство для
инъекции (внедрения) зависимости.
• Внедрением занимается вышестоящий
компонент
IoC. Dependency Injection
21. protected $userService;
public function setUserService(
UserService $userService)
{
$this->userService = $userService;
}
public function barAction()
{
$this->userService->getUser(1);
}
IoC. Dependency Injection
22. •Кто же будет заниматься внедрением?
•Как просто конфигурировать зависимости?
IoC. Dependency Injection
23. • Специальные IoC контерйнеры.
• Для PHP Symfony Dependency Injection
• Есть версия для 5.+
• Есть версия для 5.3
IoC. Symfony DI
24. • Контейнер содержит описание объектов.
• ZF2 - LazyLoadingBroker
IoC. Symfony DI
25. <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
26. $container = new ContainerBuilder();
$loader = new XmlFileLoader($container);
$loader->load('path/container.xml');
/* @var $service UserService */
$service = $container->get('userService');
IoC. Symfony DI
33. • Прадигма программирования
• Сквозная функциональность
Лог, обработка ошибок, права доступа, транзакции.
• Первая реализация - AspectJ
АОП. Что это?
34. • JoinPoint (Точка соединения) – метод, которому нужно добавить функциональность
• Pointcut (Срез) – набор JoinPoint’ов
АОП. Основные понятия
35. /** @Cached */
public function cacheMeDude() {/* */}
/** @Log */
public function plzLogMe() {/* */}
/** @Transactional */
public function iNeedTransaction() {/* */}
АОП. Реализация на PHP
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. Изменить работу метода, не трогая готовый
код.
•Переопределение в рантайме (runkit, etc)
•«Предкомпилирование» кода
•Прокси классы
АОП. Реализация на PHP
39. Подмена объекта, прокси объектом.
Например, при создании в IoC контейнере.
$objectProxy =
ProxyClass::createProxyFromObject(
$object,
$handler
);
АОП. Реализация на PHP
40. Генерируем прокси-классы с помощью
Zend_CodeGenerator
class TestAOPCheProxy extends TestAOP
{
// Override all methods
}
АОП. Реализация на PHP
41. Override всех public и protected методов
public function method($foo, $bar)
{
return $this->invocationHandler->invoke(
$this,
new ReflectionMethod(
get_parent_class(__CLASS__),
__FUNCTION__
),
func_get_args()
);
}
АОП. Реализация на PHP
42. /** @Cached */
public function cacheMeDude() {/* */}
/** @Log */
public function plzLogMe() {/* */}
/** @Transactional */
public function iNeedTransaction() {/* */}
АОП. Реализация на PHP