Digamos que eu estou construindo uma extensão Magento 2 que faz ... bem ... não é importante. Digamos que ele faça coisas super impressionantes.
Mas quero garantir que isso seja construído usando os padrões adequados para que outros desenvolvedores possam estendê-lo.
Quando devo usar o DI em combinações com interfaces e quando não devo?
Para deixar claro aqui, é um exemplo central.
A classe Magento\Core\Helper\Data
tem um construtor 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;
}
Minha pergunta está focada no var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
(eu sei que existem outros no mesmo construtor, mas uma explicação será adequada para todos os casos, eu acho).
De acordo com o di.xml
módulo principal, o var será uma instância de Magento\Framework\App\Config
:
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
mas posso mudar isso facilmente, se precisar.
Quando devo usar interfaces como essa no meu código?
Criei este módulo de amostra incompleto (desculpe pela publicidade), onde usei essas interfaces, mas todas elas vêm do núcleo. Eu não criei um dos meus. Eu devo?