Veraltete Methoden zum Speichern und Laden in Abstract Model


57

Ich sehe, dass im Entwicklungszweig des Magento 2-Repos die Methoden loadund saveaus der Magento\Framework\Model\AbstractModelKlasse veraltet sind.
Aber es gibt eine Unmenge von Klassen im Kern, die diese Klasse erweitern und saveund verwenden load.
Beim Erstellen eines eigenen Moduls für den CRUD-Teil meiner Entitäten befolge ich dieselben Richtlinien wie bei einem Kernmodul.
Da diese Methoden jedoch veraltet sind, wäre ich eher für die Zukunft gerüstet.
Was soll ich stattdessen verwenden? Oder sollte ich noch etwas erweitern?


Sind diese Methoden jetzt veraltet?
Knight017,

Antworten:


34

Sie sollten den Modul-Servicevertrag verwenden.

Für Produkt sollten Sie beispielsweise ProductRepositoryInterface verwenden

<?php
/**
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Catalog\Api;

/**
 * @api
 * @since 100.0.2
 */
interface ProductRepositoryInterface
{
    /**
     * Create product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @param bool $saveOptions
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\InputException
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\CouldNotSaveException
     */
    public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false);

    /**
     * Get info about product by product SKU
     *
     * @param string $sku
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function get($sku, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Get info about product by product id
     *
     * @param int $productId
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getById($productId, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Delete product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\StateException
     */
    public function delete(\Magento\Catalog\Api\Data\ProductInterface $product);

    /**
     * @param string $sku
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     * @throws \Magento\Framework\Exception\StateException
     */
    public function deleteById($sku);

    /**
     * Get product list
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface
     */
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}

Wenn der Modul-Servicevertrag nicht verfügbar ist, können Sie mit ResourceModel Entitäten speichern.


Aha. Das macht Sinn. Aber können Sie bestätigen, dass alle CRUD-Kernmodule an einem Punkt Serviceverträge haben werden?
Marius

1
Ich sehe, dass die Implementierung von ProductRepositoryInterfacenoch loadin den Methoden getund verwendet getById. Sollte ich anstelle dieser loadMethode das Ressourcenmodell für mein Modul verwenden ?
Marius

2
Ja, für Ihr Modul ist es besser, ResourceModel in Ihrem Modul SL
KAndy

6

1
Haben Sie Beispiele? Ich habe mir die offiziellen Review- und Newsletter-Module angesehen und sie rufen direkt "save" auf. Ich kann kein Beispiel für die Verwendung von ResourceModel finden. Ich habe es für mein Modul definiert, aber wie verwende ich es?
Jānis Elmeris

24

Nach meinem Verständnis wird Magento auf Hydratoren mit extract()und hydrate()Methoden umstellen .

Dieser Link hat funktioniert, aber es scheint, als hätte das Magento-Team ihn zurückgesetzt: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Den Verlauf des Commits finden Sie hier: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Die wichtigen Dateien sind:

  • EntityHydrator.php
  • EntityMetadata.php
  • HydratorInterface.php
  • MetadataPool.php

Ich schlage auch vor, dass Sie die Dateien unter dem ActionOrdner sowie die SequenceDateien auschecken.

Soweit ich es verstanden habe (hier kann ich mich völlig irren):

  • Die Dateien unter dem ActionOrdner sind CRUD-Aktionen
  • SequenceSind die Dateien Iteratoren?

Das war ein Gespräch, das vor einiger Zeit stattgefunden hat (Alan Storm hat es erwähnt? Ich kann mich nicht erinnern), also bin ich mir nicht sicher, ob das Magento-Team immer noch so vorgeht.

Aktualisieren

Nach meinen Recherchen lautet das interne Magento-Ticket für diese Änderung "MAGETWO-50676". Hier sind die zugehörigen Commits, die ich gefunden habe:

Es gibt wahrscheinlich mehr TBH, aber ich habe keine Lust, im gesamten Repo nach Commit-Nachrichten zu suchen ^^

Wenn Sie nicht mit Hydratoren vertraut sind, empfehlen wir Ihnen, diesen Link zu überprüfen: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Update von 2.1

Magento verwendet jetzt die EntityManagerKlasse, um die Vererbung zu ersetzen. Weitere Informationen finden Sie hier: Magento 2.1: Verwenden des Entity Managers


1
Okay. Gute Theorie. Aber ich könnte ein Beispiel aus dem Kern verwenden. Es tut mir leid, aber meine Magento-Fähigkeiten werden fortgesetzt, um zu kopieren / einzufügen / zu ersetzen :). Sie haben Aktions- und Sequenzdateien erwähnt. Kannst du genauer sein?
Marius

@Marius das ist leider alles was ich weiß. Ich kann mich nicht erinnern, woher ich diese Informationen habe, aber der Plan zu dieser Zeit war, dieses bestimmte Commit zu verwenden: github.com/magento/magento2/tree/… , um den Wechsel von load()/save()zu Hydratoren zu implementieren. Ich SequencesActions
gehe

4
Sie finden ein Beispiel in der aktuellen Lademethode für das CMS-Blockressourcenmodell : github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Es verwendet den EntityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /…, das eine ReadMain-Operation ausführt (glaube ich) github.com/magento/magento2/blob/develop/lib/internal/Magento/…, die die Skeleton-Entität mit den geladenen Entitätsdaten hydriert ( schöner umzug von magento;))
david verholen


2

Eine Alternative zur veralteten Lademethode von Magento 2 ist die Lademethode des Ressourcenmodells.

public funtion getCustomer($id)
{
   $customerModel = $this->customerFactory->create();
   $this->customerResource->load($customerModel, $id);
   $customerModel->getEmail();  
}

Hier ist der erste Parameter das Modellobjekt und der zweite Parameter die ID, die Sie laden möchten.

Eine Alternative zur veralteten Speichermethode von Magento 2 ist die Speichermethode des Ressourcenmodells.

public funtion save($taskData)
{
   $taskModel = $this->taskFactory->create()->setData($taskData);
   $this->resource->save($taskModel);
}

Die Speichermethode akzeptiert nur einen Parameter, der Ihr Modellobjekt ist.

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.