Ich habe ziemlich viel Erfahrung mit Magento, aber mir wurde klar, dass ich nicht verstehe, welche Art des Ladens eines Modells die richtige ist und warum. Ich habe alles über das Thema gelesen, was ich konnte, aber Leute, die solche Dinge erklären, gehen nie tief genug, um zu erklären, warum sie diese spezielle Methode anstelle einer anderen verwenden. Nehmen wir an, es gibt kein Repository für das Modell, das ich laden möchte.
Bis jetzt habe ich immer model im Konstruktor verwendet und es dann einfach geladen.
public function __construct(
\Vendor\Module\Model\Something $somethingModel
) {
$this->somethingModel = $somethingModel;
}
public function getTestById($id) {
return $this->somethingModel->load($id);
}
Und es hat immer wie beabsichtigt funktioniert, ich bin mir auch ziemlich sicher, dass es im Kern allgemein verwendet wird oder zumindest verwendet wurde.
Aber dann sah ich einen meiner Kollegen mit
modelFactory->create()->load($id)
Soweit ich weiß, werden Fabriken zum Erstellen einer neuen Entität verwendet. Wenn ich beispielsweise ein neues Produkt erstellen möchte, kann ich die Fabrik erstellen, mit Daten füllen und dann speichern. Andererseits habe ich angefangen, das Thema zu untersuchen, und ich habe ein Beispiel von Fabian Schmengler ( Wann sollten wir ein Repository und eine Factory in Magento 2 verwenden? ) Gesehen, der das Modell auf diese Weise geladen hat und auch andere davon abgehalten hat, die Modelle einfach zu laden. Ich erkläre nicht, warum, abgesehen davon, dass es nicht Teil des Servicevertrags ist. Soweit ich weiß, sind Repositorys Teil von Serviceverträgen, daher sehe ich hier keinen Zusammenhang, wenn es darum geht, Modelle zu laden, die nicht über ein Repository verfügbar sind.
Um noch mehr Verwirrung zu stiften, habe ich auch eine Möglichkeit gefunden, das Modell zu laden, indem ich das resourceModel von der erstellten modelFactory abgerufen habe. Es wurde von Vinai Kopp vorgestellt ( Wie implementiere ich einen Servicevertrag für ein benutzerdefiniertes Modul in Magento 2? ) Und jetzt bin ich es völlig verloren, da ich immer gelesen habe, dass ich Ressourcenmodelle nicht direkt verwenden sollte.
Könnte mir jemand sagen, welcher Weg der richtige ist und warum ich ihn anstelle aller anderen Methoden verwenden sollte?
Antworten:
Der erste Schritt, den Sie für das betreffende Modell überprüfen sollten, ist: Gibt es einen Repository-Servicevertrag? Wenn ja, verwenden Sie dies, da Serviceverträge an die semantische Versionierung gebunden sind und sich bis zum Erscheinen von Magento 3.x weiterhin so verhalten, wie sie sollten. Wenn Sie Ihre eigenen Module mit Modellen erstellen, die Persistenz erfordern, sollten Sie natürlich auch das Repository dafür schreiben.
Wenn kein Repository vorhanden ist, verwenden Sie das Ressourcenmodell . Beachten Sie, dass Ressourcenmodelle keinen Status enthalten: Sie verwenden die Persistenz für ihre "regulären" Modelle. Daher müssen Sie sie nicht in einer Fabrik einschließen:
"Welchen Nutzen bringt ein Servicevertrag / Repository gegenüber einem Ressourcenmodell?" du könntest fragen. Theoretisch sollte ein Ressourcenmodell nur für die Persistenz eines Datenmodells verantwortlich sein , während ein Repository auch die zusätzlichen Aufgaben berücksichtigt, die beim Speichern einer Entität anfallen. Denken Sie daran, Indizes zu aktualisieren, Beziehungen zu anderen Entitäten herzustellen usw. Dies ist die Theorie, obwohl diese Linien im wirklichen Leben häufig verschwimmen. Aber es ist gut für dich, das im Hinterkopf zu behalten.
Sie sollten nicht die Modelle direkt verwenden
save()
,load()
etc. -Methoden. Sie sind veraltet, weil sie semantisch falsch sind. Denken Sie fest darüber nach:Und genau dieser letzte Punkt macht den Unterschied: Wenn man mit anderen Modulen kommuniziert, sollte man sich in einer idealen Welt niemals auf die interne persistente Logik dieser Module verlassen müssen (oder auf eine ihrer öffentlichen Methoden, aber das ist eine andere Diskussion). sondern nur , dass die Funktionalität verwenden , das von der Module zur Verfügung gestellt Serviceverträge .
Abschließend
Um Ihre Frage zu beantworten: in der Reihenfolge Ihrer Präferenz. Der richtige Weg, um ein Modell zu laden, ist:
quelle
Models
Diese Datenschnittstelle wird verwendet, um nur die Daten in Objekten zu speichern , dh zuset
undget
Daten für eine Zeile.ResourceModels
sind ein Mechanismus, der für die Persistenz solcher Daten verantwortlich ist, dh die SQL-Abfrage tatsächlichsave
oderload
Daten in dasModel
Objekt ausführen .Der richtige Weg zu
load
undsave
sollte darin bestehen, ein Repository zu erstellen oder aus einer Ressource wie folgt zu laden :Hier
\MyVendor\MyModule\Api\Data\QueueInterface
wird vonQueue
Model implementiert .Hinter den Kulissen erstellen wir also tatsächlich ein
Model
Objekt und dannloading
dasResourceModel
Objekt. Dies ist der richtige Weg zum Laden oder Speichern.quelle