Méthodes d'enregistrement et de chargement obsolètes dans le modèle abstrait


57

Je vois que dans la branche develop du repo de Magento 2, les méthodes loadet savede la Magento\Framework\Model\AbstractModelclasse sont obsolètes.
Mais il y a un milliard de classes dans le noyau qui étendent cette classe et utilisent saveet load.
Lors de la création de mon propre module pour la partie CRUD de mes entités, je suis les mêmes directives qu’un module de base.
Mais puisque ces méthodes sont déconseillées, je préférerais être préparé pour l'avenir.
Que devrais-je utiliser à la place d'eux? Ou je devrais prolonger quelque chose d'autre?


Ces méthodes sont-elles obsolètes maintenant?
Knight017 le

1
Si, maintenant, vous voulez dire 2.3, oui, ils sont: github.com/magento/magento2/blob/2.3/lib/internal/Magento/…
Marius

Réponses:


34

Vous devez utiliser le contrat de service de module.

Par exemple, pour un produit, vous devez utiliser 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 le contrat de service de module n'est pas disponible, vous pouvez utiliser ResourceModel pour enregistrer des entités.


Je vois. C'est logique. Mais pouvez-vous confirmer que tous les modules CRUD de base auront des contrats de service en même temps?
Marius

1
Je vois que la mise en oeuvre ProductRepositoryInterfaceutilise encore loaddans les méthodes getet getById. Devrais-je utiliser le modèle de ressource pour mon module au lieu de cette loadméthode?
Marius

2
oui, pour votre module, utilisez plutôt ResourceModel dans votre module SL
KAndy

6
pouvez-vous s'il vous plaît donner un exemple de code pour savoir comment utiliser ResourceModel
Yogesh Karodiya

1
Avez-vous des exemples? J'ai consulté les modules de révision officielle et de newsletter, et ils appellent "enregistrer" directement. Je ne trouve pas d'exemple d'utilisation de ResourceModel. Je l'ai défini pour mon module, mais comment l'utiliser?
Jānis Elmeris

24

D'après ce que j'ai compris, ce qui va se passer c'est que Magento va passer aux hydrateurs avec extract()et hydrate()méthodes.

Ce lien fonctionnait auparavant, mais il semble que l'équipe de Magento l'a annulé: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Vous pouvez trouver l'historique du commit ici: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Les fichiers importants sont:

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

Je vous suggère également de consulter les fichiers du Actiondossier ainsi que les Sequencefichiers.

D'après ce que j'ai compris (je me trompe peut-être totalement ici):

  • les fichiers sous le Actiondossier sont des actions CRUD
  • les Sequencefichiers sont des itérateurs?

C'était une conversation qui a eu lieu il y a quelque temps (Alan Storm en a-t-il parlé? Je ne m'en souviens pas), donc je ne suis pas sûr que l'équipe de Magento continue à suivre cette voie.

Mise à jour

D'après mes recherches, le ticket interne Magento concernant ce changement est MAGETWO-50676, voici les commits connexes que j'ai réussi à trouver:

Il y a probablement plus de TBH mais je n'ai pas envie de parcourir l'intégralité du dépôt pour les messages de validation ^^

Si vous ne connaissez pas les hydrateurs, je vous suggère de vérifier ce lien: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

Mise à jour à partir de 2.1

Magento utilise maintenant la EntityManagerclasse pour remplacer l'héritage. Pour plus d'informations, cliquez ici: Magento 2.1: en utilisant le gestionnaire d'entités


1
D'accord. Belle théorie. Mais je pourrais utiliser un exemple du noyau. Je suis désolé, mais mes compétences magento se résument à copier / coller / remplacer :). Vous avez mentionné les fichiers Action et Séquence. Peux-tu être plus précis?
Marius

@Marius malheureusement c'est tout ce que je sais. Je ne me souviens plus d'où j'ai tiré cette information, mais le plan à cette époque consistait à utiliser ce commit particulier: github.com/magento/magento2/tree/… pour implémenter le basculement load()/save()vers des hydrateurs. J'assume le Sequencestravail comme des itérateurs et Actionssont des actions CRUD
Raphael au Pianisme Numérique

4
vous trouverez un exemple dans la méthode de chargement du modèle de ressource de bloc cms en cours: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… Il utilise le entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /… qui exécute une opération ReadMain (je pense) github.com/magento/magento2/blob/develop/lib/internal/Magento/… qui hydrate l'entité squelette avec les données d'entité chargées ( beau coup de Magento;))
David Verholen


2

Une alternative à la méthode de chargement obsolète de Magento 2 est la méthode de chargement du modèle de ressource.

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

Ici, le premier paramètre est l'objet du modèle et le second est l'id que vous voulez charger.

Une alternative à la méthode d'enregistrement obsolète de Magento 2 est la méthode d'enregistrement du modèle de ressource.

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

La méthode save accepte un seul paramètre qui est votre objet de modèle.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.