Magento 2: Unterschied zwischen Modellen und Datenmodellen


13

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?

Antworten:


7

Meine Erklärung:

Es ist sehr schwierig, den Unterschied zwischen einem Modell und einem Datenmodell zu verstehen. Wenn ich mit wenigen Worten sagen muss, könnte ich sagen, dass ein Modell die Engine und ein Datenmodell ihre Informationen darstellt .

In Ihrem Beispiel können Sie mit der Kundenentität beispielsweise sehen, wie die Methode authenticateoder validatePassworddas Kundenmodell beibehalten werden, da sie Teil der Engine sind und nicht direkt mit Informationen umgehen. Auf der anderen Seite mögen Methoden getExtensionAttributes, da der Umgang mit Informationen im Datenmodell erhalten bleibt.

Ich denke, dies ist nur eine bessere Projektabwicklung, genauso wie die Aufteilung zwischen Modellen und Ressourcenmodellen. Man könnte sich fragen, warum man sie auch braucht.

Warum brauchen Sie sie:

Wenn Sie Kundeninformationen (zum Beispiel) mithilfe der API verfügbar machen möchten, benötigen Sie eine Schnittstelle ( \Magento\Customer\Api\Data\CustomerInterface) mit Gettern , die alle Attribute Ihrer Entität definieren, und wenn Sie über eine andere Getter-Methode verfügen, die keine Informationen darstellt, die Sie verfügbar machen möchten (z. B .: getRandomConfirmationKey), du hast ein Problem!

Dies ist der Grund, warum in meinem Beispiel ein getRandomConfirmationKeyTeil von model ( \Magento\Customer\Model\Customer) und ein getFirstnameTeil von data ist.

Eine schnelle Regel könnte sein:

  • Wenn Ihre Methode eine Tabellenspalte, ein Attribut oder eine Entitätsinformation irgendeiner Art darstellt, sollte sie in das Datenmodell aufgenommen werden .
  • Wenn Ihre Methode eine "Aktion" für die Informationen ist, diese Informationen verarbeitet oder Sie sie in der Datei "webapi.xml" deklarieren , sollte es sich um eine Modellmethode handeln .

POST:

In wenigen Worten: Betrachten Sie ein Datenmodell fast als DTO.


Alle Methoden in \Magento\Customer\Api\Data\CustomerInterfacewerden 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\Productund\Magento\Catalog\Api\Data\ProductInterface
Milan Simek

2

Neben der Antwort von @ Phoenix128_RiccardoT sollte beachtet werden, dass Repositorys (dh MagentoCms\Api\BlockRepositoryoder Magento\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()und delete()) alle sind gekennzeichnet als deprecated. Dies liegt daran, dass dieser Job in Repositorys verschoben wird (vorausgesetzt, dass in einigen Fällen das gesamte Repository diese reguläre Modellmethode aufruft save(), aber mir scheint der Weg klar zu sein).


1
Was ist mit Produktdatenmodell. Es gibt kein Produktdatenmodell
Sivakumar

2

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.phpLegt fest, welche Methoden für die API verfügbar sind. In Model/Customer.phpMagento 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.

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.