किसी मॉडल को लोड करने का उचित तरीका क्या और क्यों है


9

मुझे मैगेंटो के साथ काफी अनुभव है लेकिन मैंने महसूस किया कि मुझे समझ नहीं आता कि मॉडल को लोड करने का कौन सा तरीका सही है और क्यों। मैंने वह सब कुछ पढ़ा है जो मैं इस विषय के बारे में कर सकता हूं, लेकिन इस तरह से सामान की व्याख्या करने वाले लोग वास्तव में कभी भी गहराई से समझाने के लिए नहीं जाते हैं, इस विशिष्ट पद्धति का उपयोग दूसरे के बजाय क्यों करें। मान लें कि जिस मॉडल को मैं लोड करना चाहता हूं, उसके लिए कोई रिपॉजिटरी नहीं है।

अब तक मैं निर्माण में हमेशा मॉडल का उपयोग कर रहा था और फिर इसे लोड कर रहा था।

public function __construct(
    \Vendor\Module\Model\Something $somethingModel
) {
    $this->somethingModel = $somethingModel;
}

public function getTestById($id) {
    return $this->somethingModel->load($id);
}

और यह हमेशा इरादा के अनुसार काम करता है, मुझे पूरा यकीन है कि यह कम से कम कोर में आमतौर पर इस्तेमाल किया गया था।

लेकिन फिर मैंने अपने एक साथी को इस्तेमाल करते हुए देखा

modelFactory->create()->load($id)

जहां तक ​​मैं समझता हूं कि कारखानों का उपयोग एक नई इकाई बनाने के लिए किया जा रहा है, उदाहरण के लिए, यदि मैं एक नया उत्पाद बनाना चाहता हूं तो मैं कारखाना बना सकता हूं, इसे डेटा के साथ आबाद कर सकता हूं और फिर इसे बचा सकता हूं। लेकिन फिर, मैंने इस विषय पर शोध करना शुरू कर दिया और मैंने फैबियन शेंगलर ( जब हमें Magento 2 में एक रिपोजिटरी और फैक्ट्री का उपयोग करना चाहिए? ) से उदाहरण देखा ? जो इस तरह से मॉडल लोड कर रहा था और दूसरों को भी बस मॉडल लोड करने से हतोत्साहित किया, उसने 'नहीं किया। t यह क्यों समझाते हुए भी कहा कि यह 'सेवा अनुबंध का हिस्सा नहीं है'। जहां तक ​​मैं समझता हूं कि रिपॉजिटरी सेवा अनुबंधों का हिस्सा हैं इसलिए मुझे यहां कोई कनेक्शन नहीं दिखता है जब यह उन लोडिंग मॉडल की बात आती है जो रिपॉजिटरी के माध्यम से उपलब्ध नहीं हैं।

कुछ और भ्रम को जोड़ने के लिए, मैंने मॉडलफैक्ट्री से रिसोर्समॉडल प्राप्त करके मॉडल को लोड करने का एक तरीका पाया है, यह विनई कोप्प (मैगेंटो 2 में एक कस्टम मॉड्यूल के लिए सेवा अनुबंध कैसे लागू करें) द्वारा प्रस्तुत किया गया था और अब मैं हूं ? पूरी तरह से खो जाने के कारण मैंने हमेशा पढ़ा है कि मुझे संसाधन मॉडल का सीधे उपयोग नहीं करना चाहिए।

तो हाँ, क्या कोई मुझे बता सकता है कि कौन सा तरीका सही है और मुझे अन्य सभी तरीकों के बजाय इसका उपयोग क्यों करना चाहिए?


मैं सचमुच इस धागे को भ्रमित करने वाले उदाहरण के रूप में जोड़ रहा हूं, क्या आपने मेरी पोस्ट भी पढ़ी है?
czs

1
अच्छा सवाल, मैं बाद में विस्तार से जवाब देने के लिए समय निकालने की कोशिश करूँगा। मैं आपको पहले ही बता सकता हूं कि यह बहुत अलग है: यदि आप अपने स्वयं के मॉडल (उदाहरण के लिए विनई) या कोर या तीसरे पक्ष के मॉड्यूल (मेरे उत्तर) के मॉडल लोड करते हैं। इसके अलावा, कंस्ट्रक्टर के माध्यम से मॉडल को इंजेक्ट करने से आपको हर बार एक ही उदाहरण मिलेगा, जिससे अवांछित दुष्प्रभाव हो सकते हैं।
फेबियन शेंगलर

जवाबों:


12

खैर, सवाल में मॉडल के लिए आपको पहले चरण की जांच करनी चाहिए: क्या कोई रिपॉजिटरी सेवा अनुबंध है? यदि ऐसा है, तो इसका उपयोग करें, क्योंकि सेवा अनुबंध शब्दार्थ संस्करण के लिए बाध्य है और यह व्यवहार करना जारी रखेगा, जब तक कि Magento 3.x बाहर नहीं आ जाता है। कहने की जरूरत नहीं है, जब आप मॉडल के साथ अपने खुद के मॉड्यूल बनाते हैं जिसमें दृढ़ता की आवश्यकता होती है, तो आपको उसके लिए भंडार भी लिखना चाहिए।

public function __construct(
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
    $this->productRepository = $productRepository;
    /** @var \Magento\Catalog\Api\Data\ProductInterface $product */
    $this->productRepository->save($product);
}

यदि कोई रिपॉजिटरी मौजूद नहीं है, तो संसाधन मॉडल का उपयोग करें । ध्यान दें कि संसाधन मॉडल में कोई स्थिति नहीं है: वे अपने 'नियमित' मॉडल के लिए दृढ़ता का उपयोग कर रहे हैं। इसलिए आपको किसी कारखाने का उपयोग करके उन्हें शामिल करने की आवश्यकता नहीं है:

public function __construct(
    \Magento\Catalog\Model\ResourceModel\Product $productResource,
    \Magento\Catalog\Model\ProductFactory $productFactory
) {
    $this->productResource = $productResource;
    $this->productFactory = $productFactory;
    ...
    /** @var \Magento\Catalog\Api\Data\ProductInterface $product */
    $product = $this->productFactory->create();
    $this->productResource->save($product);
}

"तो क्या लाभ एक संसाधन मॉडल पर एक सेवा अनुबंध / रिपॉजिटरी लाता है?" आप पूछ सकते हैं। खैर, सिद्धांत रूप में एक संसाधन मॉडल केवल एक डेटा मॉडल की दृढ़ता के लिए जिम्मेदार होना चाहिए , जबकि एक रिपॉजिटरी एक इकाई को बचाने पर शामिल अतिरिक्त कार्यों को भी ध्यान में रखता है। अनुक्रमणिका को अद्यतन करने, अन्य संस्थाओं के साथ संबंध बनाने आदि के बारे में सोचें। यह सिद्धांत है, हालांकि वास्तविक जीवन में ये रेखाएँ अक्सर धुंधला हो जाती हैं। लेकिन अपने आप को यह ध्यान में रखना अच्छा है।

आप नहीं करना चाहिए का उपयोग मॉडल 'प्रत्यक्ष save(), load()आदि -methods। वे पदावनत हैं क्योंकि यह शब्दार्थ गलत है। इसके बारे में एक ठोस तरीके से सोचें:

  • (डेटा) मॉडल केवल डेटा युक्त के लिए जिम्मेदार होना चाहिए।
  • संसाधन मॉडल को ऐसे डेटा की दृढ़ता के लिए जिम्मेदार होना चाहिए।
  • दृढ़ता कार्यों के लिए मॉड्यूल के अंदर और बाहर संचार के लिए रिपॉजिटरी जिम्मेदार होनी चाहिए ।

और यह अंतिम बिंदु है जो एक अंतर बनाता है: जब एक आदर्श दुनिया में अन्य मॉड्यूल के साथ संचार करते हैं, तो किसी को उस मॉड्यूल के आंतरिक निरंतर तर्क (या उस मामले के लिए सार्वजनिक तरीकों में से किसी पर भी भरोसा नहीं करना चाहिए , लेकिन यह एक और चर्चा है), लेकिन केवल उस कार्यक्षमता का उपयोग करें जो मॉड्यूल सेवा अनुबंध द्वारा प्रदान की गई है ।

निष्कर्ष के तौर पर

अपने प्रश्न का उत्तर देने के लिए: वरीयता क्रम में। मॉडल को लोड करने का सही तरीका है:

  • यदि कोई रिपॉजिटरी है, तो रिपॉजिटरी का उपयोग करके इसे लोड करें।
  • केवल अगर कोई रिपॉजिटरी नहीं है, तो संसाधन मॉडल (एक कारखाने के साथ संयोजन में) का उपयोग करें।

1
ठीक है, इसलिए अगर मैं सही ढंग से पालन करता हूं - जब मैं नया डेटा जोड़ना / जोड़ना चाहता हूं और इसे डेटाबेस में सहेजना चाहता हूं तो मुझे संसाधन मॉडल का उपयोग करना चाहिए और जब मैं डेटा को मेमोरी में लोड करना चाहता हूं तो मुझे फैक्टरी का उपयोग करना चाहिए? तो क्या ऐसी कोई स्थिति है जिसमें मुझे सीधे मॉडल का उपयोग करना चाहिए (जैसे कि निर्माता में मॉडल वर्ग का उपयोग करने में)?
czs

@ आप सही हैं मैंने उसी के लिए मॉडल लोडिंग के लिए अधिक वर्णनात्मक उदाहरण जोड़ा है।
मिलिंद सिंह

2
  • Modelsडेटा इंटरफ़ेस का उपयोग केवल वस्तुओं में डेटा को रखने setऔर getएक पंक्ति के डेटा के लिए किया जाता है।
  • ResourceModelsएक ऐसा तंत्र है जो इस तरह के डेटा की दृढ़ता के लिए जिम्मेदार है, अर्थात वास्तव में saveया ऑब्जेक्ट loadमें डेटा के लिए SQL क्वेरी निष्पादित करें Model

करने का सही तरीका loadऔर saveएक बनाने के द्वारा किया जाना चाहिए भंडार या एक संसाधन से लोड हो रहा है इस प्रकार है:

namespace MyVendor\MyModule\Model;

class QueueRepository impliments \MyVendor\MyModule\Api\QueueRepositoryInterface
{

    /** @var \MyVendor\MyModule\Model\ResourceModel\Queue  */
    public $resource;

    /** @var \MyVendor\MyModule\Model\QueueFactory  */
    public $modelFactory;

    public function __construct(
        \MyVendor\MyModule\Model\ResourceModel\Queue $resource,
        \MyVendor\MyModule\Model\QueueFactory $modelFactory
    ) {
        $this->resource = $resource;
        $this->modelFactory = $modelFactory;
    }

    /**
     * Save
     * @param \MyVendor\MyModule\Api\Data\QueueInterface $queue
     * @return $queue
     * @throws \Exception
     */
    public function save(\MyVendor\Integrator\Api\Data\QueueInterface $queue)
    {
        $this->resource->save($queue);
        return $queue;
    }

    /**
     * Save
     * @param \MyVendor\MyModule\Api\Data\QueueInterface $queue
     * @param int $id
     * @return $queue
     * @throws \Exception
     */
    public function load(\MyVendor\MyModule\Api\Data\QueueInterface $queue, $id)
    {
        $this->resource->load($queue, $id);
        return $queue;
    }

    public function getById($id)
    {
        $queue = $this->modelFactory->create();
        $this->resource->load($queue, $id);
        return $queue;
    }
}

यहाँ, मॉडल \MyVendor\MyModule\Api\Data\QueueInterfaceद्वारा आरोपित किया गया है Queue

तो, पर्दे के पीछे, हम वास्तव में एक Modelवस्तु का निर्माण कर रहे हैं तो loadingयह ResourceModelवस्तु द्वारा । यह लोड करने या बचाने का सही तरीका है।

        $queue = $this->modelFactory->create();
        $this->resource->load($queue, $id);
        return $queue;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.