Bonnes pratiques Magento 2 DI


19

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\Dataa 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.xmlmodule 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?


"Disons que ça fait des trucs super géniaux." At-il une tête flottante de personnes qui sont en ligne dans stackexchange? Parce que j'installerais ça;)
David Manners

1
@DavidManners J'essaierai de porter toutes mes extensions 1.x vers 2.0 afin qu'elles soient également portées. Je ne connais pas la partie flottante, mais je vais voir ce que je peux faire.
Marius

À 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.
Tobias

1
@TobiasZander, tu veux dire que je dois créer une interface pour presque TOUT? Merde, c'est beaucoup de travail.
Marius

@Marius, si vous voulez être flexible à 100%, en quelque sorte oui. Mais je ne le ferais pas trop. Personnellement, j'aime aussi odetocode.com/blogs/scott/archive/2009/06/08/… comme introduction quand c'est réellement utile
Tobias

Réponses:


9

À 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.


7

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


Je suis curieux de savoir si l'utilisation des interfaces affecte les performances de quelque manière que ce soit?
amitshree

1
L'appel de la fonction de chargement automatique n'est pas gratuit. voir l'exemple: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.