Disons que je construis une extension Magento 2 qui fait ... eh bien ... pas important. Disons que ça fait des trucs super géniaux.
Mais je veux m'assurer que c'est construit en utilisant les normes appropriées afin que d'autres développeurs puissent l'étendre.
Quand dois-je utiliser la DI en combinaison avec des interfaces et quand ne le devrais-je pas?
Pour être clair, voici un exemple de base.
La classe Magento\Core\Helper\Data
a un constructeur comme celui-ci:
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;
}
Ma question est centrée sur le var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
(je sais qu'il y en a d'autres dans le même constructeur, mais une explication conviendra à tous les cas je pense).
Selon le di.xml
module de base, la var sera une instance de Magento\Framework\App\Config
:
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
mais je peux facilement changer cela si j'ai besoin.
Quand dois-je utiliser des interfaces comme celle-ci dans mon code?
J'ai créé cet exemple de module incomplet (désolé pour la publicité), où j'ai utilisé de telles interfaces, mais toutes proviennent du noyau. Je n'en ai pas créé un. Devrais-je?