Metodi di salvataggio e caricamento obsoleti nel modello astratto


57

Vedo che nel ramo di sviluppo del repository Magento 2 i metodi loade quelli savedi Magento\Framework\Model\AbstractModelclasse sono obsoleti.
Ma ci sono classi gazillion nel core che estendono questa classe e usano savee load.
Quando creo il mio modulo per la parte CRUD delle mie entità seguo le stesse linee guida di un modulo principale.
Ma dal momento che questi metodi sono deprecati, preferirei essere preparato per il futuro.
Cosa dovrei usare al posto di loro? O dovrei estendere qualcos'altro?


Questi metodi sono ora obsoleti?
Knight017,

1

Risposte:


34

È necessario utilizzare il contratto di servizio del modulo.

Ad esempio, per il prodotto è necessario utilizzare ProductRepositoryInterface

<?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);
}

Se il Contratto di servizio del modulo non è disponibile, è possibile utilizzare ResourceModel per salvare le entità.


Vedo. Questo ha senso. Ma puoi confermare che tutti i moduli CRUD principali avranno contratti di servizio a un certo punto?
Marius

1
Vedo che l'implementazione di ProductRepositoryInterfaceusi ancora loadnei metodi gete getById. Dovrei usare il modello di risorsa per il mio modulo anziché questo loadmetodo?
Marius

2
sì, per il tuo modulo è meglio usare ResourceModel nel modulo SL
KAndy

6
puoi per favore dare qualche esempio di codice su come possiamo usare ResourceModel
Yogesh Karodiya

1
Hai qualche esempio? Ho esaminato i moduli ufficiali di revisione e newsletter e stanno chiamando direttamente "salva". Non riesco a trovare un esempio dell'uso di ResourceModel. L'ho definito per il mio modulo, ma come si usa?
Jānis Elmeris,

24

Da quello che ho capito, ciò che accadrà è che Magento passerà agli idratanti con extract()e hydrate()metodi.

Questo collegamento funzionava, ma sembra che il team di Magento lo abbia ripristinato: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

È possibile trovare la cronologia del commit qui: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

I file importanti sono:

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

Ti suggerisco anche di controllare i file nella Actioncartella e i Sequencefile.

Da quello che ho capito (potrei sbagliarmi qui):

  • i file nella Actioncartella sono azioni CRUD
  • i Sequencefile sono iteratori?

Quella è stata una conversazione che è avvenuta qualche tempo fa (è stato Alan Storm a parlarne? Non ricordo), quindi non sono sicuro che il team Magento stia ancora andando in quel modo.

Aggiornare

Dalla mia ricerca, il biglietto Magento interno relativo a questa modifica è MAGETWO-50676, ecco i relativi commit che sono riuscito a trovare:

Probabilmente c'è più TBH ma non mi va di sfogliare l'intero repository per i messaggi di commit ^^

Se non hai familiarità con gli idratori, ti suggerisco di controllare quel link: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Aggiornamento da 2.1

Magento ora sta usando la EntityManagerclasse per sostituire l'eredità, puoi trovare maggiori informazioni qui: Magento 2.1: usando il gestore entità


1
Ok. Bella teoria. Ma potrei usare un esempio dal nucleo. Mi dispiace, ma le mie abilità magento riprendono a copiare / incollare / sostituire :). Hai menzionato i file di azione e sequenza. Può essere più preciso?
Marius

@Marius purtroppo è tutto ciò che so. Non riesco a ricordare da dove ho preso quelle informazioni, ma il piano in quel momento era di usare questo particolare commit: github.com/magento/magento2/tree/… per implementare il passaggio da load()/save()agli idratori. Presumo di Sequenceslavorare come iteratori e Actionssono azioni CRUD
Raffaello al Pianismo digitale,

4
trovi un esempio nel metodo di caricamento del modello di risorsa del blocco cms corrente: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Utilizza entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento / ... che esegue un'operazione ReadMain (credo) github.com/magento/magento2/blob/develop/lib/internal/Magento/… che idrata l'entità scheletro con i dati dell'entità caricata ( bella mossa da Magento;))
David Verholen,


2

Un'alternativa al metodo di caricamento obsoleto Magento 2 è il metodo di caricamento del modello di risorsa.

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

qui il primo parametro è l'oggetto modello e il secondo parametro è l'id che si desidera caricare.

Un'alternativa al metodo di salvataggio obsoleto di Magento 2 è il metodo di salvataggio del modello di risorsa.

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

Il metodo save accetta solo un parametro che è l'oggetto del modello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.