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?
Réponses:
À mon humble avis, ce n'est pas une question spécifique à Mage2, plus généralement "Quand utiliser les interfaces". Cela dépend de l'endroit où vous souhaitez que quelqu'un puisse étendre votre extension. Je dirais partout où vous travaillez avec la logique métier, ce qui pourrait changer. ;) En outre, les objets sans comportement (par exemple les objets de données simples) ne changent généralement pas.
Si vous voulez être 100% flexible, vous devez en quelque sorte utiliser des interfaces partout. Mais je ne le ferais pas trop. Personnellement, j'aime aussi http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx comme introduction quand c'est réellement utile.
la source
Magento2 encourage l'utilisation des principes SOLID .
Le principe d'inversion de dépendance dit directement que le code doit dépendre des abstractions (interfaces).
Le principe de ségrégation des interfaces indique que de nombreuses interfaces spécifiques au client valent mieux qu'une interface à usage général. Les classes peuvent également définir une interface protégée, de sorte que les interfaces sont plus préférées d'un point de vue architectural.
PHP ne prend pas non plus en charge l'héritage multiple des classes, mais prend en charge plusieurs implémentations d'interfaces. C'est un point de plus pour les interfaces.
Donc, une règle simple peut être utilisée: si vous ne savez pas quoi utiliser, TOUJOURS utiliser des interfaces .
PS. La performance ce n'est pas une raison pour moi de ne pas utiliser d'interfaces
la source