Digamos que estoy construyendo una extensión de Magento 2 que ... bueno ... no es importante. Digamos que hace cosas súper increíbles.
Pero quiero asegurarme de que esto se construya utilizando los estándares adecuados para que otros desarrolladores puedan extenderlo.
¿Cuándo debería usar el DI en combinaciones con interfaces y cuándo no debería?
Para que quede claro aquí es un ejemplo central.
La clase Magento\Core\Helper\Data
tiene un constructor como este:
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;
}
Mi pregunta se centra en la var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
(sé que hay otros en el mismo constructor, pero creo que una explicación se ajustará a todos los casos).
De acuerdo con el di.xml
del módulo central, la var será una instancia de Magento\Framework\App\Config
:
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
pero puedo cambiar eso fácilmente si lo necesito.
¿Cuándo debo usar interfaces como esas en mi código?
Creé este módulo de muestra incompleto (perdón por la publicidad), donde utilicé tales interfaces, pero todas provienen del núcleo. No he creado uno propio. ¿Debería?