Powiedzmy, że buduję rozszerzenie Magento 2, które działa ... cóż ... nieważne. Powiedzmy, że robi super niesamowite rzeczy.
Chcę jednak upewnić się, że jest on budowany przy użyciu odpowiednich standardów, aby inni programiści mogli go rozszerzyć.
Kiedy powinienem używać DI w połączeniu z interfejsami, a kiedy nie?
Wyjaśnienie tego jest kluczowym przykładem.
Klasa Magento\Core\Helper\Data
ma taki konstruktor:
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;
}
Moje pytanie koncentruje się na var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
(wiem, że są inne w tym samym konstruktorze, ale jedno wyjaśnienie będzie pasować do wszystkich przypadków, które moim zdaniem).
Według di.xml
modułu podstawowego var będzie instancją Magento\Framework\App\Config
:
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
ale mogę to łatwo zmienić, jeśli zajdzie taka potrzeba.
Kiedy powinienem używać takich interfejsów w kodzie?
Stworzyłem ten niekompletny moduł przykładowy (przepraszam za reklamę), w którym korzystałem z takich interfejsów, ale wszystkie pochodzą z rdzenia. Nie stworzyłem własnego. Czy powinienem?