Soyut Modelde kullanımdan kaldırılmış kaydet ve yükleme yöntemleri


57

Ben Magento 2 repo geliştirmek dalında yöntemleri görüyoruz loadve savegelen Magento\Framework\Model\AbstractModelsınıfına kaldırılıyor.
Ancak bu sınıf uzanan ve kullanım çekirdekte bir milyarlarca sınıfları vardır saveve load.
Varlıklarımın CRUD kısmı için kendi modülümü oluştururken çekirdek modülün yaptığı gibi aynı yönergeleri takip ediyorum.
Ancak bu yöntemlerin kullanımdan kaldırılmasından dolayı gelecek için hazırlanmayı tercih ederim.
Onlar yerine ne kullanmalıyım? Yoksa başka bir şey uzatmalı mıyım?


Bu yöntemler şimdi kullanımdan kaldırıldı mı?
Knight017

1
Eğer şimdiye dek
Marius

Yanıtlar:


34

Modül Servis Sözleşmesini kullanmalısınız.

Örneğin, ürün için ProductRepositoryInterface kullanmalısınız

<?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);
}

Modül Hizmet Sözleşmesi mevcut değilse, varlıkları kaydetmek için ResourceModel'i kullanabilirsiniz.


Anlıyorum. Bu mantıklı. Ancak tüm temel CRUD modüllerinin bir noktada servis sözleşmeleri olacağını doğrulayabilir misiniz?
Marius

1
Ben uygulanması görüyoruz ProductRepositoryInterfacehala kullanır loadyöntemlerinde getve getById. Bu model yerine kaynak modelini modülüm için kullanmalı mıyım load?
Marius

2
evet, modülünüzün ResourceModel'i Modül
SL'nizde

6
ResourceModel
Yogesh Karodiya,

1
Hiç örneğin var mı? Resmi inceleme ve bülten modüllerine baktım ve doğrudan “kaydet” diyorlar. ResourceModel kullanarak bir örnek bulamıyorum. Modülüm için tanımlamıştım, fakat nasıl kullanılır?
Jnisnis Elmeris

24

Anladığım kadarıyla ne olacak, Magento hidratörler extract()ve hydrate()yöntemlerle geçiş yapacak .

Bu bağlantı işe yarardı ama Magento ekibi geri aldı gibi görünüyor: https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

Taahhüdün geçmişini burada bulabilirsiniz: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity

Önemli dosyalar:

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

Ayrıca dosyaları ve Actionklasör altındaki dosyaları da kontrol etmenizi öneririm Sequence.

Anladığım kadarıyla (burada tamamen yanlış olabilir):

  • Actionklasörün altındaki dosyalar CRUD eylemleridir
  • Sequencedosyalar yineleyiciler nelerdir?

Bu, bir süre önce olan bir konuşmaydı (Alan Storm'dan bahsetti mi? Hatırlayamıyorum) bu yüzden Magento takımının hala o şekilde devam edip etmediğinden emin değilim.

Güncelleme

Araştırmamdan, bu değişikliğe ilişkin iç Magento bileti MAGETWO-50676'dir, işte bulmayı başardığım taahhütler:

Muhtemelen daha fazla TBH var ama taahhüt mesajları için tüm depoya göz atmak istemiyorum ^^

Eğer hidratörler hakkında bilginiz yoksa, şu bağlantıyı kontrol etmenizi öneririm: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

2.1’den güncelleme

Magento artık EntityManagermirası değiştirmek için sınıfı kullanıyor; burada daha fazla bilgi bulabilirsiniz: Magento 2.1: varlık yöneticisini kullanma


1
Tamam. Güzel teori. Fakat çekirdekten bir örnek kullanabilirim. Üzgünüm, ama magento becerilerim kopyala / yapıştır / değiştir :). Eylem ve Sıra dosyalarından bahsettiniz. Daha spesifik olabilir misin?
Marius

@Marius ne yazık ki tüm bildiğim bu. Bu bilgiyi nereden aldığımı hatırlamıyorum, ancak o zamanki plan bu özel taahhüdü kullanmaktı: github.com/magento/magento2/tree/… ' load()/save()dan hidratörlere geçiş yapmak için. SequencesYineleyiciler gibi çalışmayı ve ActionsCRUD eylemleri olduğunu varsayıyorum
Digital Pianism'deki Raphael

4
Geçerli cms bloğu kaynak modeli yükleme yönteminde bir örnek buluyorsunuz : github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… entityManager-> load github.com/magento/magento2/ kullanır Bir ReadMain işlemini yürüten blob / develop / lib / internal / Magento /… (sanırım) github.com/magento/magento2/blob/develop/lib/internal/Magento/… iskelet varlıklarını yüklü varlık verileriyle nemlendirir ( Magento'dan güzel bir hamle;))
David Verholen 17:16


2

Magento 2 Deprecated Load Method'ya alternatif, kaynak model yükleme yöntemidir.

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

burada ilk parametre model nesnesi ve ikinci parametre yüklemek istediğiniz kimliğidir.

Magento 2 Deprecated Save Method'a bir alternatif, kaynak modeli kaydetme yöntemidir.

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

kaydetme yöntemi, model nesneniz olan yalnızca bir parametreyi kabul eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.