Przestarzałe metody zapisu i ładowania w Modelu abstrakcyjnym

57

Widzę, że w branży rozwoju w Magento 2 repo metody loadoraz saveod Magento\Framework\Model\AbstractModelklasy są przestarzałe.
Ale w rdzeniu znajdują się klasy gazillionów, które rozszerzają tę klasę i używają savei load.
Tworząc własny moduł dla części CRUD moich podmiotów, kieruję się tymi samymi wytycznymi, co moduł podstawowy.
Ale ponieważ te metody są przestarzałe, wolałbym być przygotowany na przyszłość.
Czego powinienem użyć zamiast nich? Czy powinienem przedłużyć coś jeszcze?

Marius
źródło
Czy te metody są już przestarzałe?
Knight017
1
Jeśli masz na myśli 2.3, tak, są to: github.com/magento/magento2/blob/2.3/lib/internal/Magento/...
Marius

Odpowiedzi:

34

Powinieneś skorzystać z umowy serwisowej modułu.

Na przykład dla produktu należy użyć interfejsu 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);
}

Jeśli umowa serwisowa modułu nie jest dostępna, możesz użyć ResourceModel do zapisania encji.

KAndy
źródło
Widzę. To ma sens. Ale czy możesz potwierdzić, że wszystkie podstawowe moduły CRUD będą miały w pewnym momencie umowy serwisowe?
Marius
1
Widzę, że implementacja ProductRepositoryInterfacenadal wykorzystuje loadmetody geti getById. Czy powinienem używać modelu zasobów dla mojego modułu zamiast tej loadmetody?
Marius
2
tak, aby twój moduł lepiej używał ResourceModel w module SL
KAndy
6
czy możesz podać przykładowy kod, w jaki sposób możemy korzystać z ResourceModel
Yogesh Karodiya,
1
Czy masz jakieś przykłady? Spojrzałem na oficjalną recenzję i moduły biuletynu, a one bezpośrednio nazywają „zapisz”. Nie mogę znaleźć przykładu użycia ResourceModel. Mam to zdefiniowane dla mojego modułu, ale jak go używać?
Jānis Elmeris
24

Z tego, co zrozumiałem, to, co się stanie, to że Magento przełączy się na hydratatory za pomocą extract()i hydrate()metod.

Ten link kiedyś działał, ale wygląda na to, że zespół Magento wycofał go: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Historię zatwierdzenia można znaleźć tutaj: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Ważne pliki to:

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

Sugeruję również sprawdzenie plików w Actionfolderze, a także Sequenceplików.

Z tego, co zrozumiałem (mogę się tutaj całkowicie mylić):

  • pliki w Actionfolderze to akcje CRUD
  • te Sequencepliki są iteratory?

To była rozmowa, która wydarzyła się jakiś czas temu (czy to Alan Storm wspomniał o tym? Nie pamiętam), więc nie jestem pewien, czy zespół Magento nadal podąża tą drogą.

Aktualizacja

Z moich badań wynika, że ​​wewnętrzny bilet Magento dotyczący tej zmiany to MAGETWO-50676, oto powiązane zobowiązania, które udało mi się znaleźć:

Prawdopodobnie jest więcej TBH, ale nie mam ochoty przeglądać całego repozytorium w poszukiwaniu komunikatów zatwierdzania ^^

Jeśli nie znasz hydratorów, sugeruję sprawdzić ten link: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Aktualizacja z 2.1

Magento używa teraz EntityManagerklasy do zastąpienia dziedziczenia, więcej informacji można znaleźć tutaj: Magento 2.1: korzystanie z menedżera encji

Raphael at Digital Pianism
źródło
1
Dobrze. Niezła teoria. Ale mógłbym użyć przykładu z rdzenia. Przepraszam, ale moje umiejętności magento zostały wznowione do kopiowania / wklejania / zastępowania :). Wspomniałeś o plikach akcji i sekwencji. Czy mógłbyś to sprecyzować?
Marius
@Marius niestety to wszystko, co wiem. Nie pamiętam, skąd wziąłem te informacje, ale w tamtym czasie planowałem użyć tego konkretnego zatwierdzenia: github.com/magento/magento2/tree/... do wdrożenia przełączenia z load()/save()na hydratory. Zakładam, że Sequencespraca jest jak iteratory i Actionssą działaniami CRUD
Raphael w Digital Pianism
4
znajdziesz przykład w bieżącej metodzie ładowania modelu zasobów bloku cms: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/…. Używa obiektu entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /…, który wykonuje operację ReadMain (myślę) github.com/magento/magento2/blob/develop/lib/internal/Magento/…, który uwadnia szkielet według załadowanych danych encji ( niezły ruch z Magento;))
David Verholen
2

Alternatywą dla przestarzałej metody ładowania Magento 2 jest metoda ładowania modelu zasobów.

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

tutaj pierwszym parametrem jest obiekt modelu, a drugim parametrem jest identyfikator, który chcesz załadować.

Alternatywą dla przestarzałej metody zapisu Magento 2 jest metoda zapisu modelu zasobów.

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

Metoda save akceptuje tylko jeden parametr, który jest obiektem modelu.

Chirag Dodia
źródło