Передовий досвід Magento 2 DI


19

Скажімо, я будую розширення Magento 2, яке робить .... ну ... не важливо. Скажімо, це робить надзвичайно чудові речі.
Але я хочу переконатися, що це побудовано за допомогою відповідних стандартів, щоб інші розробники могли це розширити.

Коли я повинен використовувати DI в поєднанні з інтерфейсами, а коли не слід?
Щоб це було зрозуміло, ось основний приклад.

Клас Magento\Core\Helper\Dataмає такий конструктор:

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

Моє запитання орієнтоване на var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(я знаю, що в цьому ж конструкторі є й інші, але одне пояснення підійде до всіх випадків, які я думаю).

Відповідно до di.xmlосновного модуля var буде екземпляром Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

але я можу легко змінити це, якщо мені потрібно.

Коли я повинен використовувати такий інтерфейс у своєму коді?
Я створив цей неповний зразок-модуль (вибачте за рекламу), де я використовував такі інтерфейси, але всі вони походять з ядра. Я не створив свого власного. Повинен я?


"Скажімо, це дуже приголомшливі речі". Чи має плаваючі голови людей, які перебувають в Інтернеті в stackexchange? Тому що я встановив би це;)
Девід Маннерс

1
@DavidManners Я спробую перенести всі мої розширення 1.x на 2.0, щоб переноситися також. Я не знаю про плаваючу частину, але я побачу, що я можу зробити.
Маріус

Імхо, це не специфічне питання для Mage2, загалом "Коли використовувати інтерфейси". Це залежить від того, де ви хочете, щоб хтось міг розширити ваше розширення. Я б сказав, що ви працюєте з бізнес-логікою, яка може змінитися. ;) Крім того, що об'єкти без поведінки (наприклад, прості об'єкти даних) зазвичай не змінюються.
Тобіас

1
@TobiasZander, ви хочете сказати, що я повинен створити інтерфейс майже для ВСЕ? Чорт, що це багато роботи.
Маріус

@Marius, якщо ти хочеш бути 100% гнучким, якось так. Але я б не передушував це. Мені особисто також подобається odetocode.com/blogs/scott/archive/2009/06/08/… як вступ, коли це насправді корисно
Тобіас

Відповіді:


9

Імхо, це не специфічне питання для Mage2, загалом "Коли використовувати інтерфейси". Це залежить від того, де ви хочете, щоб хтось міг розширити ваше розширення. Я б сказав, що ви працюєте з бізнес-логікою, яка може змінитися. ;) Крім того, що об'єкти без поведінки (наприклад, прості об'єкти даних) зазвичай не змінюються.

Якщо ви хочете бути на 100% гнучкими, вам доведеться користуватися інтерфейсами скрізь. Але я б не передушував це. Мені особисто також подобається http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx як вступ, коли це насправді корисно.


7

Magento2 сприяє використанню принципів SOLID .

Принцип інверсії залежності прямо говорить, що код повинен залежати від абстракцій (інтерфейсів).

Принцип сегментації інтерфейсу говорить про те, що багато інтерфейсів, орієнтованих на клієнта, краще, ніж один інтерфейс загального призначення. Класи також можуть визначати захищений інтерфейс, тому інтерфейси більш переважні з архітектурної точки зору.

Також PHP не підтримують багатократне успадкування класів, але підтримують багаторазову реалізацію інтерфейсів. Це ще один момент для інтерфейсів.

Отже, може бути використане просте правило: якщо ви не знаєте, чим користуватися, ВИНАГИ використовуйте інтерфейси .

PS. Продуктивність, це не є причиною для мене не використовувати інтерфейси


Мені цікаво, чи використання інтерфейсів впливає на продуктивність?
Амітшрі

1
Виклик функції автоматичного завантаження не безкоштовний. див. приклад: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.