Best Practices für Magento 2 DI


19

Angenommen, ich erstelle eine Magento 2-Erweiterung, die ... nun ja ... nicht wichtig ist. Sagen wir, es macht super tolle Sachen.
Aber ich möchte sicherstellen, dass dies mit den richtigen Standards erstellt wird, damit andere Entwickler es erweitern können.

Wann sollte ich die DI in Kombination mit Schnittstellen verwenden und wann nicht?
Um es klar zu machen, hier ist ein Kernbeispiel.

Die Klasse Magento\Core\Helper\Datahat einen Konstruktor wie diesen:

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;
}

Meine Frage konzentriert sich auf den var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(ich weiß, dass es andere im selben Konstruktor gibt, aber eine Erklärung wird für alle Fälle passen, die ich denke).

Nach dem di.xmlaus dem Kernmodul wird die var eine Instanz von Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

aber ich kann das leicht ändern, wenn ich brauche.

Wann sollte ich solche Schnittstellen in meinem Code verwenden?
Ich habe dieses unvollständige Beispielmodul erstellt (Entschuldigung für die Werbung), in dem ich solche Schnittstellen verwendet habe, aber alle kommen aus dem Kern. Ich habe keine eigene erstellt. Sollte ich?


"Sagen wir, es macht super tolle Sachen." Gibt es schwebende Köpfe von Personen, die im Stapelaustausch online sind? Weil ich das installieren würde;)
David Manners

1
@DavidManners Ich werde versuchen, alle meine 1.x-Erweiterungen auf 2.0 zu portieren, damit sie auch portiert werden. Ich weiß nichts über den schwebenden Teil, aber ich werde sehen, was ich tun kann.
Marius

Imho, das ist keine Mage2-spezifische Frage, im Allgemeinen "Wann man Schnittstellen verwendet". Das hängt davon ab, wo Sie möchten, dass jemand Ihre Nebenstelle erweitern kann. Ich würde überall sagen, wo Sie mit Geschäftslogik arbeiten, was sich ändern könnte. ;) Außerdem ändern sich Objekte ohne Verhalten (zB einfache Datenobjekte) normalerweise nicht.
Tobias

1
@TobiasZander, meinst du damit, dass ich für fast ALLES ein Interface erstellen muss? Verdammt, das ist viel Arbeit.
Marius

@Marius, wenn du 100% flexibel sein willst, irgendwie ja. Aber ich würde es nicht übertreiben. Ich persönlich mag auch odetocode.com/blogs/scott/archive/2009/06/08/… als Einführung, wenn es wirklich nützlich ist
Tobias

Antworten:


9

Imho, das ist keine Mage2-spezifische Frage, im Allgemeinen "Wann man Schnittstellen verwendet". Das hängt davon ab, wo Sie möchten, dass jemand Ihre Nebenstelle erweitern kann. Ich würde überall sagen, wo Sie mit Geschäftslogik arbeiten, was sich ändern könnte. ;) Außerdem ändern sich Objekte ohne Verhalten (zB einfache Datenobjekte) normalerweise nicht.

Wenn Sie 100% flexibel sein wollen, müssen Sie irgendwie überall Schnittstellen verwenden. Aber ich würde es nicht übertreiben. Ich persönlich mag auch http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx als Einführung, wenn es tatsächlich nützlich ist.


7

Magento2 fördert die Nutzung von SOLID- Prinzipien.

Das Prinzip der Abhängigkeitsinversion direkt besagt, dass Code von Abstraktionen (Interfaces) abhängen sollte.

Das Prinzip der Schnittstellentrennung besagt, dass viele kundenspezifische Schnittstellen besser sind als eine universelle Schnittstelle. Klassen können auch geschützte Schnittstellen definieren, sodass diese aus architektonischer Sicht bevorzugt werden.

Außerdem unterstützt PHP nicht die mehrfache Vererbung von Klassen, sondern die mehrfache Implementierung von Schnittstellen. Das ist ein weiterer Punkt für Schnittstellen.

Daher kann eine einfache Regel verwendet werden: Wenn Sie nicht wissen, was Sie verwenden sollen, verwenden Sie IMMER Schnittstellen .

PS. Leistung Es ist kein Grund für mich, keine Schnittstellen zu verwenden


Ich bin neugierig, ob die Verwendung von Schnittstellen die Leistung in irgendeiner Weise beeinträchtigt.
Amitshree

1
Der Aufruf der Autoload-Funktion ist nicht kostenlos. siehe Beispiel: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.