Métodos obsoletos de salvar e carregar no modelo abstrato


57

Vejo que no ramo de desenvolvimento do repositório Magento 2 os métodos loade saveda Magento\Framework\Model\AbstractModelclasse são obsoletos.
Mas há um zilhão de classes no núcleo que estendem essa classe e usam savee load.
Ao criar meu próprio módulo para a parte CRUD de minhas entidades, sigo as mesmas diretrizes de um módulo principal.
Mas, como esses métodos estão obsoletos, prefiro estar preparado para o futuro.
O que devo usar em vez deles? Ou devo estender outra coisa?


Esses métodos estão obsoletos agora?
Knight017 18/01

11
Se, agora, você quer dizer 2,3, sim, são: github.com/magento/magento2/blob/2.3/lib/internal/Magento/…
Marius

Respostas:


34

Você deve usar o Contrato de serviço do módulo.

Por exemplo, para o produto, você deve 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);
}

Se o Contrato de Serviço do Módulo não estiver disponível, você poderá usar o ResourceModel para salvar entidades.


Eu vejo. Isso faz sentido. Mas você pode confirmar que todos os módulos CRUD principais terão contratos de serviço em um ponto?
Marius

11
Vejo que a implementação de ProductRepositoryInterfaceainda usa loadnos métodos gete getById. Devo usar o modelo de recursos para o meu módulo em vez deste loadmétodo?
Marius

2
sim, para seu módulo melhor usar ResourceModel no seu módulo SL
Kandy

6
você pode por favor, dê um exemplo de código de como podemos usar ResourceModel
Yogesh Karodiya

11
Você tem algum exemplo? Eu olhei para os módulos oficiais de revisão e boletim informativo, e eles estão chamando "salvar" diretamente. Não consigo encontrar um exemplo de uso do ResourceModel. Eu o defini para o meu módulo, mas como usá-lo?
Jānis Elmeris

24

Pelo que entendi, o que vai acontecer é que o Magento vai mudar para hidratadores extract()e hydrate()métodos.

Este link costumava funcionar, mas parece que a equipe do Magento o retrocedeu: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Você pode encontrar o histórico do commit aqui: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Os arquivos importantes são:

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

Eu também sugiro que você verifique os arquivos na Actionpasta, bem como os Sequencearquivos.

Pelo que entendi (posso estar totalmente errado aqui):

  • os arquivos na Actionpasta são ações CRUD
  • os Sequencearquivos são iteradores?

Essa foi uma conversa que aconteceu há um tempo atrás (foi Alan Storm quem a mencionou? Não me lembro), então não tenho certeza se a equipe do Magento ainda está indo nessa direção.

Atualizar

De minha pesquisa, o ticket interno do Magento referente a essa alteração é MAGETWO-50676, e aqui estão os commits relacionados que consegui encontrar:

Provavelmente há mais TBH, mas não sinto vontade de navegar no repositório inteiro para obter mensagens de confirmação ^^

Se você não conhece os hidratantes, sugiro que verifique este link: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Atualização da 2.1

Magento agora está usando a EntityManagerclasse para substituir a herança, você pode encontrar mais informações aqui: Magento 2.1: usando o gerenciador de entidades


11
Está bem. Teoria legal. Mas eu poderia usar um exemplo do núcleo. Sinto muito, mas minhas habilidades em magento são retomadas para copiar / colar / substituir :). Você mencionou os arquivos de ação e sequência. Você pode ser mais específico?
Marius

@ Marius, infelizmente, é tudo o que sei. Não me lembro de onde obtive essas informações, mas o plano na época era usar esse commit específico: github.com/magento/magento2/tree/… para implementar a troca de load()/save()hidratantes. Presumo Sequencestrabalho como iteradores e Actionssão ações CRUD
Raphael em Digital pianismo

4
você encontra um exemplo no método atual de carregamento do modelo de recursos do bloco cms: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Ele usa o entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /… que executa uma operação ReadMain (acho) github.com/magento/magento2/blob/develop/lib/internal/Magento/…, que hidrata a entidade esquelética com os dados da entidade carregada ( boa jogada do Magento;))
David Verholen 17/05


2

Uma alternativa ao método de carregamento reprovado do Magento 2 é o método de carregamento do modelo de recurso.

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

aqui o primeiro parâmetro é o objeto de modelo e o segundo parâmetro é o ID que você deseja carregar.

Uma alternativa ao método de economia obsoleta do Magento 2 é o método de economia do modelo de recurso.

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

O método save aceita apenas um parâmetro que é seu objeto de modelo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.