सार मॉडल में पदावनत बचत और भार विधियाँ


57

मुझे लगता है कि Magento 2 रेपो की शाखा का विकास में तरीकों loadऔर saveसे Magento\Framework\Model\AbstractModelवर्ग पदावनत कर रहे हैं।
लेकिन कोर में एक गज़िलियन कक्षाएं हैं जो इस वर्ग का विस्तार करती हैं और उपयोग saveऔर load
अपनी संस्थाओं के CRUD भाग के लिए अपना खुद का मॉड्यूल बनाते समय मैं उसी दिशा-निर्देशों का पालन करता हूं जैसा कि एक कोर मॉड्यूल करता है।
लेकिन जब से इन विधियों को पदावनत किया जाता है, मैं भविष्य के लिए तैयार रहूंगा।
उनके बजाय मुझे क्या उपयोग करना चाहिए? या मुझे कुछ और विस्तारित करना चाहिए?


क्या अब इन विधियों को हटा दिया गया है?
नाइट ०१7

1
हैं, तो अब तक आप 2.3 मतलब है, हाँ वे हैं: github.com/magento/magento2/blob/2.3/lib/internal/Magento/...
मेरियस

जवाबों:


34

आपको मॉड्यूल सेवा अनुबंध का उपयोग करना चाहिए।

उत्पाद के लिए उदाहरण के लिए आपको 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);
}

यदि मॉड्यूल सेवा अनुबंध उपलब्ध नहीं है, तो आप संस्थाओं को बचाने के लिए ResourceModel का उपयोग कर सकते हैं।


समझा। यह समझ में आता है। लेकिन क्या आप इस बात की पुष्टि कर सकते हैं कि सभी मुख्य CRUD मॉड्यूल में एक बिंदु पर सेवा अनुबंध होगा?
मेरियस

1
मैं देखता हूं कि ProductRepositoryInterfaceअभी भी लागू करने के loadतरीकों में getऔर का उपयोग करता है getById। क्या मुझे इस loadविधि के बजाय अपने मॉड्यूल के लिए संसाधन मॉडल का उपयोग करना चाहिए ?
मेरियस

2
हां, आपके मॉड्यूल के लिए अपने मॉड्यूल SL में
संसाधनमॉडल

6
क्या आप कृपया कुछ उदाहरण कोड दे सकते हैं कि हम कैसे
रिसोर्समॉडल का

1
क्या आपके पास कोई उदाहरण है? मैंने आधिकारिक समीक्षा और न्यूज़लेटर मॉड्यूल को देखा, और वे सीधे "सेव" कह रहे हैं। मुझे ResourceModel का उपयोग करने का एक उदाहरण नहीं मिल रहा है। मैंने इसे अपने मॉड्यूल के लिए परिभाषित किया है, लेकिन इसका उपयोग कैसे करें?
जानिस एल्मरिस

24

मैंने जो समझा, उससे जो होने वाला है वह मैगेंटो extract()और hydrate()तरीकों के साथ हाइड्रेटर्स पर स्विच करने जा रहा है ।

यह लिंक काम करता था लेकिन ऐसा लगता है कि Magento की टीम ने इसे वापस ले लिया: https://github.com/magento/magento2/blob/develop/lib/intern/Magento/Framework/Model/Edity/EntityHydrator.php

आप कमिट का इतिहास यहाँ देख सकते हैं: https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3bcc/lib/internal/Magento/Framework/Model/Entity

महत्वपूर्ण फाइलें हैं:

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

मेरा सुझाव है कि आप Actionफ़ोल्डर के साथ-साथ फाइलों के नीचे की Sequenceफाइलों को भी देखें।

जो मुझे समझ में आया (मैं यहां पूरी तरह से गलत हो सकता हूं):

  • Actionफ़ोल्डर के तहत फ़ाइलें CRUD कार्रवाई कर रहे हैं
  • Sequenceफ़ाइलों iterators कर रहे हैं?

यह एक वार्तालाप था जो कुछ समय पहले हुआ था (क्या यह एलन स्टॉर्म था जिसने इसका उल्लेख किया? याद नहीं कर सकता) इसलिए मुझे यकीन नहीं है कि अगर मैगेंटो टीम अभी भी उस तरह से जा रही है।

अपडेट करें

मेरे शोध से, इस परिवर्तन के संबंध में आंतरिक मैगनेटो टिकट MAGETWO-50676 है, यहाँ मैं अपने द्वारा प्रबंधित संबंधित कमेंट्स हैं:

शायद अधिक टीबीएच है लेकिन मैं प्रतिबद्ध मेयो के लिए संपूर्ण रेपो ब्राउज़ करने का मन नहीं करता हूं ^ ^

यदि आप हाइड्रेटर्स से परिचित नहीं हैं, तो मेरा सुझाव है कि आप उस लिंक को देखें: http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

2.1 से अद्यतन करें

मैगेंटो अब EntityManagerवर्ग का उपयोग कर रहा है विरासत के स्थान पर आप यहां अधिक जानकारी पा सकते हैं: मैगेंटो 2.1: इकाई प्रबंधक का उपयोग करना


1
ठीक। अच्छा सिद्धांत है। लेकिन मैं कोर से एक उदाहरण का उपयोग कर सकता हूं। मुझे क्षमा करें, लेकिन मेरे Magento के कौशल कॉपी / पेस्ट / प्रतिस्थापित करने के लिए फिर से शुरू :)। आपने एक्शन और सीक्वेंस फाइलों का उल्लेख किया है। क्या आप अधिक विशिष्ट हो सकते हैं?
मेरियस

@ मेरी दुर्भाग्य से यह सब मुझे पता है। मुझे याद नहीं है कि मुझे वह जानकारी कहाँ से मिली थी, लेकिन उस समय की योजना इस विशेष प्रतिबद्ध का उपयोग करने के लिए थी: github.com/magento/magento2/tree/… हाइड्रेटर से स्विच को लागू करने के load()/save()लिए। मैं मानने वालों की Sequencesतरह काम करते हैं और Actions
सीआरयूडी

4
आप वर्तमान सेमी ब्लॉक संसाधन मॉडल लोड विधि में एक उदाहरण है: github.com/magento/magento2/blob/develop/app/code/Magento/Cms/... यह entityManager-> लोड का उपयोग करता github.com/magento/magento2/ blob / develop / lib / internal / Magento /… जो ReadMain ऑपरेशन को अंजाम देता है (मुझे लगता है) github.com/magento/magento2/blob/develop/lib/internal/Magento/… लोड किए गए एंटिटी डेटा के साथ कंकाल इकाई को हाइड करता है (
मैगेंटो


2

Magento 2 डिप्रेस्ड लोड विधि का एक विकल्प संसाधन मॉडल लोड विधि है।

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

यहां पहला पैरामीटर मॉडल ऑब्जेक्ट है और दूसरा पैरामीटर वह आईडी है जिसे आप लोड करना चाहते हैं।

Magento 2 डिप्रेस्ड सेव मेथड का एक विकल्प संसाधन मॉडल सेव विधि है।

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

सहेजें विधि केवल एक पैरामीटर को स्वीकार करती है जो आपका मॉडल ऑब्जेक्ट है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.