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\Data
hat 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.xml
aus 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?
Antworten:
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.
quelle
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
quelle