Métodos obsoletos de guardar y cargar en el modelo abstracto

57

Veo que en la rama de desarrollo del repositorio de Magento 2, los métodos loady savede la Magento\Framework\Model\AbstractModelclase están en desuso.
Pero hay un millón de clases en el núcleo que amplían esta clase y usan savey load.
Al crear mi propio módulo para la parte CRUD de mis entidades, sigo las mismas pautas que un módulo central.
Pero como estos métodos están en desuso, prefiero estar preparado para el futuro.
¿Qué debo usar en lugar de ellos? ¿O debería extender algo más?

Marius
fuente
¿Estos métodos están en desuso ahora?
Knight017
1
Si, por ahora te refieres a 2.3, sí, son: github.com/magento/magento2/blob/2.3/lib/internal/Magento/…
Marius

Respuestas:

34

Debe usar el contrato de servicio del módulo.

Por ejemplo, para un producto, debe usar 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);
}

Si el contrato de servicio del módulo no está disponible, puede usar ResourceModel para guardar entidades.

Kandy
fuente
Veo. Esto tiene sentido. Pero, ¿puede confirmar que todos los módulos CRUD centrales tendrán contratos de servicio en algún momento?
Marius
1
Veo que la implementación de ProductRepositoryInterfacetodavía utiliza loaden los métodos gety getById. ¿Debo usar el modelo de recursos para mi módulo en lugar de este loadmétodo?
Marius
2
sí, para que su módulo sea mejor usar ResourceModel en su Módulo SL
KAndy
66
¿podría dar un código de ejemplo de cómo podemos usar ResourceModel
Yogesh Karodiya
1
¿Tienes algún ejemplo? Miré la revisión oficial y los módulos del boletín, y están llamando directamente a "guardar". No puedo encontrar un ejemplo de uso de ResourceModel. Lo tengo definido para mi módulo, pero ¿cómo usarlo?
Jānis Elmeris
24

Por lo que entendí, lo que va a pasar es Magento va a cambiar a hidratantes con extract()y hydrate()métodos.

Este enlace solía funcionar pero parece que el equipo de Magento lo retiró: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Sin embargo, puede encontrar la historia de la confirmación aquí: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Los archivos importantes son:

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

También le sugiero que revise los archivos debajo de la Actioncarpeta, así como los Sequencearchivos.

Por lo que entendí (puedo estar totalmente equivocado aquí):

  • los archivos debajo de la Actioncarpeta son acciones CRUD
  • los Sequencearchivos son iteradores?

Esa fue una conversación que ocurrió hace un tiempo (¿fue Alan Storm quien lo mencionó? No puedo recordar), así que no estoy seguro de si el equipo de Magento todavía está yendo por ese camino.

Actualizar

Según mi investigación, el boleto interno de Magento con respecto a este cambio es MAGETWO-50676, aquí están los compromisos relacionados que logré encontrar:

Probablemente haya más TBH, pero no tengo ganas de buscar en todo el repositorio mensajes de confirmación ^^

Si no está familiarizado con los hidratadores, le sugiero que consulte ese enlace: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Actualización desde 2.1

Magento ahora está usando la EntityManagerclase para reemplazar la herencia. Puede encontrar más información aquí: Magento 2.1: usando el administrador de entidades

Raphael en Digital Pianism
fuente
1
Okay. Buena teoría Pero podría usar un ejemplo del núcleo. Lo siento, pero mis habilidades de magento se reanudan para copiar / pegar / reemplazar :). Usted mencionó los archivos de Acción y Secuencia. ¿Puedes ser mas específico?
Marius
@Marius desafortunadamente eso es todo lo que sé. No recuerdo de dónde obtuve esa información, pero el plan en ese momento era usar este commit en particular: github.com/magento/magento2/tree/… para implementar el cambio de load()/save()hidratantes. Supongo que Sequencesfuncionan como iteradores y Actionsson acciones CRUD
Raphael en Digital Pianism
44
encontrará un ejemplo en el método de carga del modelo de recurso de bloque cms actual: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Utiliza el entityManager-> load github.com/magento/magento2/ blob / development / lib / internal / Magento / ... que ejecuta una operación ReadMain (creo) github.com/magento/magento2/blob/develop/lib/internal/Magento/… que hidrata la entidad esquelética con los datos de la entidad cargada ( buen movimiento de Magento;))
David Verholen
2

Una alternativa al método de carga obsoleto de Magento 2 es el método de carga del modelo de recurso.

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

aquí el primer parámetro es el objeto modelo y el segundo parámetro es la identificación que desea cargar.

Una alternativa al método de guardado obsoleto de Magento 2 es el método de guardado del modelo de recurso.

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

El método save solo acepta un parámetro que es su objeto modelo.

Chirag Dodia
fuente