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?

Marius
fonte
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.

KAndy
fonte
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

Raphael na Digital Pianism
fonte
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.

chirag dodia
fonte