Скажімо, я будую розширення 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" />
але я можу легко змінити це, якщо мені потрібно.
Коли я повинен використовувати такий інтерфейс у своєму коді?
Я створив цей неповний зразок-модуль (вибачте за рекламу), де я використовував такі інтерфейси, але всі вони походять з ядра. Я не створив свого власного. Повинен я?