SlideShare a Scribd company logo
Deep dive in
Magento DI
Maksym Grom
Немного обо мне
Максим Гром Tech Lead in ZFort
3 года с Magento 2
6 лет преподавал в ХАИ
MailMaximGrom@gmail.com
Веду 2 канала на youtube:
Maksym Grom / WebDev. GromMax
47
Что полезного?
План доклада
Наследование ∉ киты ООП
Композиция - мейнстрим (не только в M2)
Private > Protected
Interface > Abstract Class
VirtualType, Plugin > Rewrite, Preference
Что полезного? 49
Увидеть новый уровень SOLIDности кода
S - один класс одна задача
O - все можно расширить
L - чистый конструктор
I - композиция интерфейсов - мейнстрим
D - проси интерфейс, а не реализацию
Что полезного? 50
DI в M2
Немного основ
DI это когда
Что дает DI для M2?
● Все объекты создаются из Inversion of Control
(IoC) Container
● IoC Container владеет конфигурацией каждого
класса в системе
● Объект просит зависимость через конструктор,
а IoC решает что туда передать
52
DI недостатки
● Создание дерева зависимостей при создании объекта
● Медленное создание объекта при медленном
конструкторе в зависимости
● Накладные расходы из-за рефлексии
● Обслуживание конфигурации (У M2 все есть -> xml)
Что дает DI для M2? 53
ObjectManager - IoC
Что дает DI для M2? 54
Декларативная xml схема композиции
Что дает DI для M2? 55
xsi:type
Простые типы: string, boolean, number
Опциональный параметр: null
Что дает DI для M2? 56
xsi:type =”const”
Внедрит константу класса как параметр
Что дает DI для M2? 57
xsi:type =”array”
Позволяет строить дерево параметров
Что дает DI для M2? 58
xsi:type =”init_parameter”
Внедрит $_SERVER[$key]
Что дает DI для M2? 59
xsi:type =”object”
Создаст shared инстанс класса и внедрит
Что дает DI для M2? 60
Биндинг интерфейсов к реализациям (SOLID)
Что дает DI для M2? 61
Перехват публичных методов. Plugins (SOLID)
Что дает DI для M2? 62
Запуск приложения с разными настройками
Initial
app/etc/di.xml
Global
[vendor]/[module]/etc/di.xml
Area
[vendor]/[module]/etc/[area]/di.xml
frontend, adminhtml, webapi_rest,
webapi_soap, crontab, graphql
Что дает DI для M2? 63
Как работает DI
Немного основ
Bootstrap App -> app/etc/di.xml
Как работает DI?
Загрузить initial di.xml
(app/etc/di.xml)
ObjectManager::configure($di)
MagentoFrameworkObjectManagerConfigConfig
Подготовка di в php
Создать App
65
Решить для какой area этот процесс
bin/magento http
/rest
Di
global
Di
global
cron:run
Di
crontab
Area
crontab
cli /?wsdl /admin /
Di
webapi_rest
Area
webapi_rest
Di
frontend
Area
frontend
Di
adminhtml
Area
adminhtml
Di
webapi_soap
Area
webapi_soap
Cron Job Rest Service Soap Service Action
Как работает DI? 66
ObjectManager -> create or get (Shared)
create($type, $arguments) get($type)
Cached?
Create type
Return object
Cache type
getPreference
true
false
Как работает DI? 67
Create type
create($type, $args)
$params = resolveParams($type)
$params === null
return new $type()
$args = resolveArguments($params, $args)
return create($type, $args)
Если аргумент object то создаем
через ObjectManager
Если shared то через get,
иначе через create (рекурсия)
Как работает DI? 68
Результат в M2. Single Public Method Classes
Тип класса Публичные методы
Actions dispatch
Factory create
Observer execute
Service execute
Repository* get, getById, save, getList, delete
Как работает DI? 69
Результат в M2
● Запускаются все конструкторы*, потом
методы
● Медленный конструктор - плохо
● Data Transfer Object (DTO) без
конструктора
Как работает DI? 70
Ограничения DI
ObjectManager::configure
Ограничения MagentoFrameworkObjectManagerConfigConfig
array_replace переопределяет параметры
Ограничения DI
Start from class config
trim(class, ‘’) isset(args[class])
Обновить аргументы через array_replace
true
72
Задача, добавить грид в админку
ProjectBlogetcadminhtmldi.xml
В любом гриде в админке ошибка
Невозможно создать [name]_data_source
В чем проблема?
Ограничения DI 73
Задача, добавить грид в админку
ProjectBlogetcadminhtmldi.xml
CollectionFactory
Собирается как global di.xml
Ограничения DI 74
Ограничения MagentoFrameworkObjectManagerConfigConfig
MyClass === MyClass
issue #21193 #21796
Start from class config
trim(class, ‘’) isset(args[class])
Обновить аргументы через array_replace
true
Ограничения DI 75
Задача, добавить грид в админку
ProjectBlogetcdi.xml
Не используйте слеш перед именем
класса!
Ограничения DI 76
Virtual Type
Жизнь без
наследования
Переиспользуй классы
MagentoFrameworkPricingPricePool
Virtual type 78
Регистрируй в DI новый тип
Заменяй аргументы конструктора
Virtual type 79
Внедряй новый тип на место старого
Virtual type 80
Или получай через ObjectManager
Или внедряй как Block
Или внедряй как ViewModel
Virtual type 81
Примечание
● VirtualType может быть создан из VirtualType
● Параметры конструктора type и virtualType
склеиваются через array_replace
● Для класса типа Pool нужно обеспечить
возможность склейки типов
Virtual type 82
Pool, склеиваем массив в конструкторе Virtual type 83
Задача
● Загрузить список продуктов
● Продукты конкретной категории
● Если категория anchor, то загрузить продукты
дочерних категорий
Virtual type 84
Наши пожелания
● Создать как можно меньше кода
● Не создавать новые API сервисы
● В идеале использовать
MagentoCatalogApiProductRepositoryInterface
● Не использовать ProductCollection как
зависимость в своем коде
Virtual type 85
Посмотрим что есть в ProductRepository Virtual type 86
Изучим что за ProductCollectionProcessor
Фильтры - то что нужно
Virtual type 87
FilterProcessor
Ура! Есть место и пример класса для
внедрения
Virtual type 88
Внедряем свой класс для фильтра
Ключ важен!
Virtual type 89
Осталось реализовать фильтр
$collection умеет делать такую фильтрацию
Virtual type 90
Можно пользоваться
Virtual type 91
VirtualType. Вывод
● Это экземпляр базового класса
● Идеально для композиции
● Массивы в конструкторе замещаются
полностью
● Можно создать через ObjectManager
● VirtualType можно сделать из VirtualType
Virtual type 92
Plugins
Plugin регистрируется в di.xml
Перехватывает любой публичный метод
Класс плагина не нужно наследовать
Plugin это shared объект
Plugins 94
Как DI решает кого плагинить (dev mode)
Начало
Сканировать методы
before[MetodName]
around[...], after[...]
Есть плагины в
цепочке
Завершить для этого класса
Вычислить цепочку родителей
(классы, интерфейсы)
Генерировать Interceptor
Подготовить конфиг
очередности вызовов для
методов
Этот
класс
Final?
Сортировать плагины
Подменить класс на Interceptor
true
false true
false
Plugins 95
Очередность вызова плагинов
Plugins 96
Around может прерывать цепочку вызовов Plugins 97
Plugins не работают для
Static method
- Должен быть создан класс через ObjectManager
Private method
- Не наследуются в Interceptor
Protected method
- Нарушение SOLID принципов (use preference)
VirtualType - новый объект, а не класс
- Плагинится класс
Plugins 98
Plugins. Вывод
● Используй на классы другого модуля
● Делай stateless plugin - shared object
● Before plugin для подмены входных параметров
● After plugin для подмены результата
● Around plugin > preference
● Используй на Interface > Class
Plugins 99
Factory
Задача подготовить массив моделей из CSV
Модель другого модуля с интерфейсом
Интерфейс с пометкой @api, модель нет
● Через конструктор можно получить только
один объект или shared
● Через new нельзя создавать интерфейсы
● Классы без @api могут быть удалены - проблема
обновлений
Factory. Набрать массив интерфейсных моделей 101
Magento создаст фабрику автоматически
по наличию постфикса Factory
Factory. Набрать массив интерфейсных моделей 102
Factory без хардкода
Factory. Набрать массив интерфейсных моделей 103
Factory. Вывод
● Нужно создавать объекты? Используй
Factory
● Factory - пример класса без хардкода
● Генерация Factory гарантирует
однотипность этого подхода
Factory 104
Proxy
Задача сделать CLI, работающую с frontend area
И загрузить продукт со SKU “Test”
Vendor/Module/etc/di.xml
Proxy. CLI, загрузка продукта SKU TEST 106
Добавим зависимости
Proxy. CLI, загрузка продукта SKU TEST 107
Инициализируем area и di в начале метода execute
1. Активирует area для специальных случаев (загрузка
сессии)
2. Подключает DI для area
Proxy. CLI, загрузка продукта SKU TEST 108
Проблема. ProductRepository создан в конструкторе
1. Обращение к БД в конструкторе CLI
2. Создание класса до готовности DI (1-2-3 -> 2-1-3)
Proxy. CLI, загрузка продукта SKU TEST 109
Подменяем класс на Proxy
Proxy - отложенная загрузка класса. При первом запросе к
proxy объекту будет создан исходный объект.
Назначайте Proxy только через di.xml
Proxy. CLI, загрузка продукта SKU TEST 110
Integration Test
Начало
Очистка тестовой
DB
bin/magento setup:upgrade
Запуск тестов на новой БД
Создает ConsoleListInterface
Создает все объекты команд
Для каждой команды строится
дерево зависимостей
-Запрос к БД ломает наполнение БД
-ResourceModel делает запрос к БД
-Repository внедряет ResourceModel
Proxy 111
Repository 1-3 ломает запуск тестов
ConsoleListInterface
CLI #1
CLI #2 CLI #3
CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
Proxy 112
Proxy обрывает дерево зависимостей
ConsoleListInterface
CLI #1
CLI #2 CLI #3
CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
Proxy 113
S#2 -> R#2 ломает тесты, добавим прокси
ConsoleListInterface
CLI #1
CLI #2 CLI #3
CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
Proxy 114
S#1 -> R#1 новая связь, ломает тесты
ConsoleListInterface
CLI #1
CLI #2 CLI #3
CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
Proxy 115
S#1 -> R#1 опять PROXY :(. Может есть выход?
ConsoleListInterface
CLI #1
CLI #2 CLI #3
CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
Proxy 116
Внедряй на 1 CLI 1 Service + Proxy
ConsoleListInterface
CLI #1
CLI #2 CLI #3 CLI #4
Service #1
Repository #2
Repository #3Service #2
Repository #1 Service #3
CLI Service #2CLI Service #1
CLI Service #4
CLI Service #3
Proxy 117
Proxy. Вывод
● Всегда проксируй зависимости CLI
● Минимизируй количество зависимостей CLI
● Используй Proxy для медленного
конструктора
Proxy 118
Выводы
Выводы в целом
● Создавай объекты через Factory
● Медленный конструктор - плохо (Proxy)
● Используй композицию вместо наследования
● Используй чужой код через VirtualType
● Инициализируй сервис через конструктор
● Расширяй сервисы через Plugin
120
Что почитать
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/build/di-xml-file.html
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/factories.html
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/proxies.html
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/code-generation.html
- https://alanstorm.com/magento_2_object_manager_virtual_types/
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/attributes.html
- https://devdocs.magento.com/guides/v2.3/extension-dev-guide/searching-with-repositories.html
121
Q&A

More Related Content

What's hot

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
Anton Moiseenko
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
Igor Shkulipa
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
Platonov Sergey
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
Igor Shkulipa
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления
COMAQA.BY
 
Виктор Стрелков - Jabber как инструмент разработчика
Виктор Стрелков - Jabber как инструмент разработчикаВиктор Стрелков - Jabber как инструмент разработчика
Виктор Стрелков - Jabber как инструмент разработчика
Positive Hack Days
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
Roman Brovko
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Dev2Dev
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
Igor Shkulipa
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
Anton Moiseenko
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
Victor_Cr
 
DI and Zend Framework (ZFConf2011)
DI and Zend Framework (ZFConf2011)DI and Zend Framework (ZFConf2011)
DI and Zend Framework (ZFConf2011)
Alexey Kachayev
 
Сидристый Станислав: Паттерны и антипаттерны BDD
Сидристый Станислав: Паттерны и антипаттерны BDDСидристый Станислав: Паттерны и антипаттерны BDD
Сидристый Станислав: Паттерны и антипаттерны BDD
Stanislav Sidristy
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java
Roman Brovko
 

What's hot (20)

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления
 
Виктор Стрелков - Jabber как инструмент разработчика
Виктор Стрелков - Jabber как инструмент разработчикаВиктор Стрелков - Jabber как инструмент разработчика
Виктор Стрелков - Jabber как инструмент разработчика
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
DI and Zend Framework (ZFConf2011)
DI and Zend Framework (ZFConf2011)DI and Zend Framework (ZFConf2011)
DI and Zend Framework (ZFConf2011)
 
Сидристый Станислав: Паттерны и антипаттерны BDD
Сидристый Станислав: Паттерны и антипаттерны BDDСидристый Станислав: Паттерны и антипаттерны BDD
Сидристый Станислав: Паттерны и антипаттерны BDD
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java
 

Similar to Deep Dive in Magento DI

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
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
QA Dnepropetrovsk Community (Ukraine)
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
MskDotNet Community
 
Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"
Fwdays
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышло
COMAQA.BY
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 
Git for you
Git for youGit for you
Git for you
Pavel Alexeev
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
Alex Simanovich
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
Dependency injection
Dependency injectionDependency injection
Dependency injection
GetDev.NET
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Dmytro Mindra
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
Fwdays
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
Александр Сигачев
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
LEDC 2016
 

Similar to Deep Dive in Magento DI (20)

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
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"
 
Codeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышлоCodeception + Docker + Robo и что из этого вышло
Codeception + Docker + Robo и что из этого вышло
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 
Git for you
Git for youGit for you
Git for you
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Tdd php
Tdd phpTdd php
Tdd php
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 

More from Magecom UK Limited

Magento Meetup #12. Alex Shkurko.pptx
Magento Meetup #12. Alex Shkurko.pptxMagento Meetup #12. Alex Shkurko.pptx
Magento Meetup #12. Alex Shkurko.pptx
Magecom UK Limited
 
Magento Meetup #12 Anastasiia Bondar
Magento Meetup #12 Anastasiia BondarMagento Meetup #12 Anastasiia Bondar
Magento Meetup #12 Anastasiia Bondar
Magecom UK Limited
 
Magento Meetup #12 Vlad Opukhlyi
Magento Meetup #12 Vlad OpukhlyiMagento Meetup #12 Vlad Opukhlyi
Magento Meetup #12 Vlad Opukhlyi
Magecom UK Limited
 
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
Magecom UK Limited
 
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magecom UK Limited
 
Magento enhanced media gallery - Alexander Shkurko
Magento enhanced media gallery - Alexander ShkurkoMagento enhanced media gallery - Alexander Shkurko
Magento enhanced media gallery - Alexander Shkurko
Magecom UK Limited
 
7 ошибок одного Black Friday - Влад Опухлый
7 ошибок одного Black Friday - Влад Опухлый7 ошибок одного Black Friday - Влад Опухлый
7 ошибок одного Black Friday - Влад Опухлый
Magecom UK Limited
 
Magento & Cloud - Korostelov Avexey
Magento & Cloud - Korostelov AvexeyMagento & Cloud - Korostelov Avexey
Magento & Cloud - Korostelov Avexey
Magecom UK Limited
 
Making the Magento 2 Javascript Loading Great Again - Robin van Raan
Making the Magento 2 Javascript Loading Great Again - Robin van RaanMaking the Magento 2 Javascript Loading Great Again - Robin van Raan
Making the Magento 2 Javascript Loading Great Again - Robin van Raan
Magecom UK Limited
 
From Repositories to Commands - Alexander Shkurko
From Repositories to Commands - Alexander Shkurko From Repositories to Commands - Alexander Shkurko
From Repositories to Commands - Alexander Shkurko
Magecom UK Limited
 
Advanced GIT or How to Change the History
Advanced GIT  or How to Change the HistoryAdvanced GIT  or How to Change the History
Advanced GIT or How to Change the History
Magecom UK Limited
 
MSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложностиMSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложности
Magecom UK Limited
 
Adobe Stock Integration community project
Adobe Stock Integration community projectAdobe Stock Integration community project
Adobe Stock Integration community project
Magecom UK Limited
 
Proof of Concept for Magento 2 Projects: Occamo’s Razor
Proof of Concept for Magento 2 Projects: Occamo’s RazorProof of Concept for Magento 2 Projects: Occamo’s Razor
Proof of Concept for Magento 2 Projects: Occamo’s Razor
Magecom UK Limited
 
Что нужно знать девелоперу о SEO на этапе проектирования сайта
Что нужно знать девелоперу о SEO на этапе проектирования сайтаЧто нужно знать девелоперу о SEO на этапе проектирования сайта
Что нужно знать девелоперу о SEO на этапе проектирования сайта
Magecom UK Limited
 
Magento-сертификация: инструкция по применению и как это было
Magento-сертификация: инструкция по применению и как это былоMagento-сертификация: инструкция по применению и как это было
Magento-сертификация: инструкция по применению и как это было
Magecom UK Limited
 
Experience in Magento Community Projects
Experience in Magento Community ProjectsExperience in Magento Community Projects
Experience in Magento Community Projects
Magecom UK Limited
 
UI components: synergy of backend and frontend
UI components: synergy of backend and frontendUI components: synergy of backend and frontend
UI components: synergy of backend and frontend
Magecom UK Limited
 
MSI - Reservation Challenges with 3rd-party Systems
MSI - Reservation Challenges with 3rd-party SystemsMSI - Reservation Challenges with 3rd-party Systems
MSI - Reservation Challenges with 3rd-party Systems
Magecom UK Limited
 
Business wants what?!
Business wants what?!Business wants what?!
Business wants what?!
Magecom UK Limited
 

More from Magecom UK Limited (20)

Magento Meetup #12. Alex Shkurko.pptx
Magento Meetup #12. Alex Shkurko.pptxMagento Meetup #12. Alex Shkurko.pptx
Magento Meetup #12. Alex Shkurko.pptx
 
Magento Meetup #12 Anastasiia Bondar
Magento Meetup #12 Anastasiia BondarMagento Meetup #12 Anastasiia Bondar
Magento Meetup #12 Anastasiia Bondar
 
Magento Meetup #12 Vlad Opukhlyi
Magento Meetup #12 Vlad OpukhlyiMagento Meetup #12 Vlad Opukhlyi
Magento Meetup #12 Vlad Opukhlyi
 
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
Google Page Insights and Magento 2 — Sergey Nezbritskiy | Magento Meetup Onli...
 
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
 
Magento enhanced media gallery - Alexander Shkurko
Magento enhanced media gallery - Alexander ShkurkoMagento enhanced media gallery - Alexander Shkurko
Magento enhanced media gallery - Alexander Shkurko
 
7 ошибок одного Black Friday - Влад Опухлый
7 ошибок одного Black Friday - Влад Опухлый7 ошибок одного Black Friday - Влад Опухлый
7 ошибок одного Black Friday - Влад Опухлый
 
Magento & Cloud - Korostelov Avexey
Magento & Cloud - Korostelov AvexeyMagento & Cloud - Korostelov Avexey
Magento & Cloud - Korostelov Avexey
 
Making the Magento 2 Javascript Loading Great Again - Robin van Raan
Making the Magento 2 Javascript Loading Great Again - Robin van RaanMaking the Magento 2 Javascript Loading Great Again - Robin van Raan
Making the Magento 2 Javascript Loading Great Again - Robin van Raan
 
From Repositories to Commands - Alexander Shkurko
From Repositories to Commands - Alexander Shkurko From Repositories to Commands - Alexander Shkurko
From Repositories to Commands - Alexander Shkurko
 
Advanced GIT or How to Change the History
Advanced GIT  or How to Change the HistoryAdvanced GIT  or How to Change the History
Advanced GIT or How to Change the History
 
MSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложностиMSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложности
 
Adobe Stock Integration community project
Adobe Stock Integration community projectAdobe Stock Integration community project
Adobe Stock Integration community project
 
Proof of Concept for Magento 2 Projects: Occamo’s Razor
Proof of Concept for Magento 2 Projects: Occamo’s RazorProof of Concept for Magento 2 Projects: Occamo’s Razor
Proof of Concept for Magento 2 Projects: Occamo’s Razor
 
Что нужно знать девелоперу о SEO на этапе проектирования сайта
Что нужно знать девелоперу о SEO на этапе проектирования сайтаЧто нужно знать девелоперу о SEO на этапе проектирования сайта
Что нужно знать девелоперу о SEO на этапе проектирования сайта
 
Magento-сертификация: инструкция по применению и как это было
Magento-сертификация: инструкция по применению и как это былоMagento-сертификация: инструкция по применению и как это было
Magento-сертификация: инструкция по применению и как это было
 
Experience in Magento Community Projects
Experience in Magento Community ProjectsExperience in Magento Community Projects
Experience in Magento Community Projects
 
UI components: synergy of backend and frontend
UI components: synergy of backend and frontendUI components: synergy of backend and frontend
UI components: synergy of backend and frontend
 
MSI - Reservation Challenges with 3rd-party Systems
MSI - Reservation Challenges with 3rd-party SystemsMSI - Reservation Challenges with 3rd-party Systems
MSI - Reservation Challenges with 3rd-party Systems
 
Business wants what?!
Business wants what?!Business wants what?!
Business wants what?!
 

Deep Dive in Magento DI

  • 1. Deep dive in Magento DI Maksym Grom
  • 2. Немного обо мне Максим Гром Tech Lead in ZFort 3 года с Magento 2 6 лет преподавал в ХАИ MailMaximGrom@gmail.com Веду 2 канала на youtube: Maksym Grom / WebDev. GromMax 47
  • 4. Наследование ∉ киты ООП Композиция - мейнстрим (не только в M2) Private > Protected Interface > Abstract Class VirtualType, Plugin > Rewrite, Preference Что полезного? 49
  • 5. Увидеть новый уровень SOLIDности кода S - один класс одна задача O - все можно расширить L - чистый конструктор I - композиция интерфейсов - мейнстрим D - проси интерфейс, а не реализацию Что полезного? 50
  • 7. DI это когда Что дает DI для M2? ● Все объекты создаются из Inversion of Control (IoC) Container ● IoC Container владеет конфигурацией каждого класса в системе ● Объект просит зависимость через конструктор, а IoC решает что туда передать 52
  • 8. DI недостатки ● Создание дерева зависимостей при создании объекта ● Медленное создание объекта при медленном конструкторе в зависимости ● Накладные расходы из-за рефлексии ● Обслуживание конфигурации (У M2 все есть -> xml) Что дает DI для M2? 53
  • 9. ObjectManager - IoC Что дает DI для M2? 54
  • 10. Декларативная xml схема композиции Что дает DI для M2? 55
  • 11. xsi:type Простые типы: string, boolean, number Опциональный параметр: null Что дает DI для M2? 56
  • 12. xsi:type =”const” Внедрит константу класса как параметр Что дает DI для M2? 57
  • 13. xsi:type =”array” Позволяет строить дерево параметров Что дает DI для M2? 58
  • 15. xsi:type =”object” Создаст shared инстанс класса и внедрит Что дает DI для M2? 60
  • 16. Биндинг интерфейсов к реализациям (SOLID) Что дает DI для M2? 61
  • 17. Перехват публичных методов. Plugins (SOLID) Что дает DI для M2? 62
  • 18. Запуск приложения с разными настройками Initial app/etc/di.xml Global [vendor]/[module]/etc/di.xml Area [vendor]/[module]/etc/[area]/di.xml frontend, adminhtml, webapi_rest, webapi_soap, crontab, graphql Что дает DI для M2? 63
  • 20. Bootstrap App -> app/etc/di.xml Как работает DI? Загрузить initial di.xml (app/etc/di.xml) ObjectManager::configure($di) MagentoFrameworkObjectManagerConfigConfig Подготовка di в php Создать App 65
  • 21. Решить для какой area этот процесс bin/magento http /rest Di global Di global cron:run Di crontab Area crontab cli /?wsdl /admin / Di webapi_rest Area webapi_rest Di frontend Area frontend Di adminhtml Area adminhtml Di webapi_soap Area webapi_soap Cron Job Rest Service Soap Service Action Как работает DI? 66
  • 22. ObjectManager -> create or get (Shared) create($type, $arguments) get($type) Cached? Create type Return object Cache type getPreference true false Как работает DI? 67
  • 23. Create type create($type, $args) $params = resolveParams($type) $params === null return new $type() $args = resolveArguments($params, $args) return create($type, $args) Если аргумент object то создаем через ObjectManager Если shared то через get, иначе через create (рекурсия) Как работает DI? 68
  • 24. Результат в M2. Single Public Method Classes Тип класса Публичные методы Actions dispatch Factory create Observer execute Service execute Repository* get, getById, save, getList, delete Как работает DI? 69
  • 25. Результат в M2 ● Запускаются все конструкторы*, потом методы ● Медленный конструктор - плохо ● Data Transfer Object (DTO) без конструктора Как работает DI? 70
  • 27. Ограничения MagentoFrameworkObjectManagerConfigConfig array_replace переопределяет параметры Ограничения DI Start from class config trim(class, ‘’) isset(args[class]) Обновить аргументы через array_replace true 72
  • 28. Задача, добавить грид в админку ProjectBlogetcadminhtmldi.xml В любом гриде в админке ошибка Невозможно создать [name]_data_source В чем проблема? Ограничения DI 73
  • 29. Задача, добавить грид в админку ProjectBlogetcadminhtmldi.xml CollectionFactory Собирается как global di.xml Ограничения DI 74
  • 30. Ограничения MagentoFrameworkObjectManagerConfigConfig MyClass === MyClass issue #21193 #21796 Start from class config trim(class, ‘’) isset(args[class]) Обновить аргументы через array_replace true Ограничения DI 75
  • 31. Задача, добавить грид в админку ProjectBlogetcdi.xml Не используйте слеш перед именем класса! Ограничения DI 76
  • 34. Регистрируй в DI новый тип Заменяй аргументы конструктора Virtual type 79
  • 35. Внедряй новый тип на место старого Virtual type 80
  • 36. Или получай через ObjectManager Или внедряй как Block Или внедряй как ViewModel Virtual type 81
  • 37. Примечание ● VirtualType может быть создан из VirtualType ● Параметры конструктора type и virtualType склеиваются через array_replace ● Для класса типа Pool нужно обеспечить возможность склейки типов Virtual type 82
  • 38. Pool, склеиваем массив в конструкторе Virtual type 83
  • 39. Задача ● Загрузить список продуктов ● Продукты конкретной категории ● Если категория anchor, то загрузить продукты дочерних категорий Virtual type 84
  • 40. Наши пожелания ● Создать как можно меньше кода ● Не создавать новые API сервисы ● В идеале использовать MagentoCatalogApiProductRepositoryInterface ● Не использовать ProductCollection как зависимость в своем коде Virtual type 85
  • 41. Посмотрим что есть в ProductRepository Virtual type 86
  • 42. Изучим что за ProductCollectionProcessor Фильтры - то что нужно Virtual type 87
  • 43. FilterProcessor Ура! Есть место и пример класса для внедрения Virtual type 88
  • 44. Внедряем свой класс для фильтра Ключ важен! Virtual type 89
  • 45. Осталось реализовать фильтр $collection умеет делать такую фильтрацию Virtual type 90
  • 47. VirtualType. Вывод ● Это экземпляр базового класса ● Идеально для композиции ● Массивы в конструкторе замещаются полностью ● Можно создать через ObjectManager ● VirtualType можно сделать из VirtualType Virtual type 92
  • 49. Plugin регистрируется в di.xml Перехватывает любой публичный метод Класс плагина не нужно наследовать Plugin это shared объект Plugins 94
  • 50. Как DI решает кого плагинить (dev mode) Начало Сканировать методы before[MetodName] around[...], after[...] Есть плагины в цепочке Завершить для этого класса Вычислить цепочку родителей (классы, интерфейсы) Генерировать Interceptor Подготовить конфиг очередности вызовов для методов Этот класс Final? Сортировать плагины Подменить класс на Interceptor true false true false Plugins 95
  • 52. Around может прерывать цепочку вызовов Plugins 97
  • 53. Plugins не работают для Static method - Должен быть создан класс через ObjectManager Private method - Не наследуются в Interceptor Protected method - Нарушение SOLID принципов (use preference) VirtualType - новый объект, а не класс - Плагинится класс Plugins 98
  • 54. Plugins. Вывод ● Используй на классы другого модуля ● Делай stateless plugin - shared object ● Before plugin для подмены входных параметров ● After plugin для подмены результата ● Around plugin > preference ● Используй на Interface > Class Plugins 99
  • 56. Задача подготовить массив моделей из CSV Модель другого модуля с интерфейсом Интерфейс с пометкой @api, модель нет ● Через конструктор можно получить только один объект или shared ● Через new нельзя создавать интерфейсы ● Классы без @api могут быть удалены - проблема обновлений Factory. Набрать массив интерфейсных моделей 101
  • 57. Magento создаст фабрику автоматически по наличию постфикса Factory Factory. Набрать массив интерфейсных моделей 102
  • 58. Factory без хардкода Factory. Набрать массив интерфейсных моделей 103
  • 59. Factory. Вывод ● Нужно создавать объекты? Используй Factory ● Factory - пример класса без хардкода ● Генерация Factory гарантирует однотипность этого подхода Factory 104
  • 60. Proxy
  • 61. Задача сделать CLI, работающую с frontend area И загрузить продукт со SKU “Test” Vendor/Module/etc/di.xml Proxy. CLI, загрузка продукта SKU TEST 106
  • 62. Добавим зависимости Proxy. CLI, загрузка продукта SKU TEST 107
  • 63. Инициализируем area и di в начале метода execute 1. Активирует area для специальных случаев (загрузка сессии) 2. Подключает DI для area Proxy. CLI, загрузка продукта SKU TEST 108
  • 64. Проблема. ProductRepository создан в конструкторе 1. Обращение к БД в конструкторе CLI 2. Создание класса до готовности DI (1-2-3 -> 2-1-3) Proxy. CLI, загрузка продукта SKU TEST 109
  • 65. Подменяем класс на Proxy Proxy - отложенная загрузка класса. При первом запросе к proxy объекту будет создан исходный объект. Назначайте Proxy только через di.xml Proxy. CLI, загрузка продукта SKU TEST 110
  • 66. Integration Test Начало Очистка тестовой DB bin/magento setup:upgrade Запуск тестов на новой БД Создает ConsoleListInterface Создает все объекты команд Для каждой команды строится дерево зависимостей -Запрос к БД ломает наполнение БД -ResourceModel делает запрос к БД -Repository внедряет ResourceModel Proxy 111
  • 67. Repository 1-3 ломает запуск тестов ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 Proxy 112
  • 68. Proxy обрывает дерево зависимостей ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 Proxy 113
  • 69. S#2 -> R#2 ломает тесты, добавим прокси ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 Proxy 114
  • 70. S#1 -> R#1 новая связь, ломает тесты ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 Proxy 115
  • 71. S#1 -> R#1 опять PROXY :(. Может есть выход? ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 Proxy 116
  • 72. Внедряй на 1 CLI 1 Service + Proxy ConsoleListInterface CLI #1 CLI #2 CLI #3 CLI #4 Service #1 Repository #2 Repository #3Service #2 Repository #1 Service #3 CLI Service #2CLI Service #1 CLI Service #4 CLI Service #3 Proxy 117
  • 73. Proxy. Вывод ● Всегда проксируй зависимости CLI ● Минимизируй количество зависимостей CLI ● Используй Proxy для медленного конструктора Proxy 118
  • 75. Выводы в целом ● Создавай объекты через Factory ● Медленный конструктор - плохо (Proxy) ● Используй композицию вместо наследования ● Используй чужой код через VirtualType ● Инициализируй сервис через конструктор ● Расширяй сервисы через Plugin 120
  • 76. Что почитать - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/build/di-xml-file.html - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/factories.html - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/proxies.html - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/code-generation.html - https://alanstorm.com/magento_2_object_manager_virtual_types/ - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/attributes.html - https://devdocs.magento.com/guides/v2.3/extension-dev-guide/searching-with-repositories.html 121
  • 77. Q&A