Mir ist bekannt, dass Magento 2 Datenmodelle als Teil der Servicevertragsarchitektur eingeführt hat. Datenmodelle implementieren normalerweise Schnittstellen, die in Api / Data / eines Moduls definiert sind.
Magento scheint aber auch die alten Modelle beibehalten zu haben.
Nehmen wir ein Beispiel zum Modul-Kunden.
- Datenmodell-Schnittstelle definiert in Api / Data / CustomerInterface.php
- Die obige Schnittstelle ist in Model / Data / Customer.php implementiert
- Das Datenmodell verfügt erwartungsgemäß über alle Get- und Setter-Funktionen für die Kundenvariablen
- Zusätzlich zu den oben genannten gibt es auch eine Model / Customer.php. Auch dies hat Getter- und Setter-Funktion. Dies ähnelt eher einem Magento 1-Modell, das eine Verbindung zum ResourceModel herstellt (Model / ResourceModel / Customer.php).
- In Model / ResourceModel / CustomerRepository.php sammeln verschiedene Funktionen Daten aus dem Magnento 1-Modell, übertragen sie in das Datenmodell und geben dann das Datenmodell zurück.
Warum braucht man das alte Modell? Warum kann das Datenmodell keine direkte Verbindung zum ResourceModel herstellen?
quelle
\Magento\Customer\Api\Data\CustomerInterface
werden für die REST / SOAP-API verfügbar gemacht (falls aktiviert). Sie benötigen jedoch kein Datenmodell, um auszuwählen, welche Methoden verfügbar gemacht werden sollen, da Sie stattdessen einfach die Schnittstelle mit dem "echten" Modell verbinden können. So wird es gemacht mit\Magento\Catalog\Model\Product
und\Magento\Catalog\Api\Data\ProductInterface
Neben der Antwort von @ Phoenix128_RiccardoT sollte beachtet werden, dass Repositorys (dh
MagentoCms\Api\BlockRepository
oderMagento\Customer\Api\CustomerRepositoryInterface
) auch erwarten, dass Sie ein Datenmodell bereitstellen und kein reguläres. Datenmodelle sind eine Abstraktionsschicht über Standardmodellen, die nur die von der Entität bereitgestellten Daten verfügbar macht. Alle "Aktionen" über diese Daten werden an einen anderen Ort verschoben.Es ähnelt ein wenig der Idee einer Entität in Symfony2 und Symfony3, bei der Entitäten nur Daten enthalten und jegliche Datenmanipulation im Entitätsmanager stattfindet. In Magento2 wurde diese Rolle meines Erachtens Repositories zugewiesen.
Alte Modelle sind immer noch bei uns, weil sie wie Magento2 entwickelt wurden. Sie haben offenbar nicht mit der leeren Datei index.php begonnen, sondern Code aus M1 erneut verwendet. Wenn Sie einen Blick auf Standardmodell Methoden nehmen (
load()
,save()
unddelete()
) alle sind gekennzeichnet alsdeprecated
. Dies liegt daran, dass dieser Job in Repositorys verschoben wird (vorausgesetzt, dass in einigen Fällen das gesamte Repository diese reguläre Modellmethode aufruftsave()
, aber mir scheint der Weg klar zu sein).quelle
Modelle kapseln die speicherunabhängige Geschäftslogik, sie kennen die Datenbank-Engines oder -Instanzen nicht. In Magento 2 sind Datenmodelle DTOs ( Data Transfer Objects ), die Implementierung der DTO-spezifischen Schnittstellen (Data Model) für Magento CRUD-Modelle (das Modell) ) legt fest, welche Klassenmethoden über die Magento WebAPI verfügbar sind.
Model/Data/Customer.php
Legt fest, welche Methoden für die API verfügbar sind. InModel/Customer.php
Magento 1 werden benutzerdefinierte Get- und Setter- Methoden für Nicht-API-Vorgänge implementiert.Model/ResourceModel/CustomerRepository.php
ist Teil einer neuen Funktion, die in Magento 2 - Serviceverträge eingeführt wurde. Sie funktioniert mit der Kombination von DTO (Datenmodellen).Da wir wissen, dass Magento ORM aus den Modellen, Ressourcenmodellen und Sammlungen besteht und von der Datenbank abhängt, besteht der Zweck eines Servicevertrags darin, die Speicherlogik auszublenden, damit sich ein mit dem Repository verbundener Client (Servicevertrag) nicht um den Zielspeicher kümmert Motor.
quelle