क्योंकि मेरे लिए सही रास्ता खोजना मुश्किल था, नीचे आप मेरे द्वारा किए गए सर्वोत्तम अभ्यास को पा सकते थे। आनंद लें, यदि आवश्यक हो तो मेरी अंग्रेजी को सही करें और कहें कि मैं गलत हूं। :)
संपादित करें: ... और मुझे पता चला कि मैं किसी पहलू पर गलत था। इसलिए मैंने राफेल के उत्तरों के बाद मूल पोस्ट को अपडेट किया जिससे मुझे अधिक समझने में मदद मिली। उसे धन्यवाद !
नीचे इस्तेमाल अवधारणा :
यदि आप इन अवधारणाओं के साथ सहज हैं तो नीचे दिए गए कोड और स्पष्टीकरण को समझना आपके लिए आसान होगा:
- इंजेक्शन निर्भरता (
$this->variable
कोड में प्रत्येक चर इंजेक्शन के रूप में) - सेवा अनुबंध और रिपोजिटरी
- फ़ैक्टरी
प्रसंग :
बस अधिक संदर्भ के लिए, कल्पना करें कि हमारे पास एक मॉड्यूल है जिसका निर्माण सही तरीके से किया गया है:
- एक ब्लॉक वर्ग CustomBlock एक विधि से युक्त
getCustomModel($id)
, - यह विधि परम में पारित आईडी के आधार पर एक CustomModel ऑब्जेक्ट लौटाती है,
- CustomModel प्रकार में मॉडल के अनुरूप है
\Vendor\Module\Model\CustomModel
- यह मॉडल अपने संसाधन मॉडल (इन
\Vendor\Module\Model\ResourceModel\CustomModel
) के साथ आता है - और इसके भंडार (में
\Vendor\Module\Model\CustomModelRepository
) के साथ।
प्रश्न :
- कस्टममॉडल ऑब्जेक्ट को लोड करने वाली सभी चीज़ों को जाने देने के लिए सबसे अच्छा अभ्यास क्या है?
आप load()
एक CustomModel ऑब्जेक्ट से उपयोग नहीं कर सकते क्योंकि यह विधि पदावनत है।
अच्छा अभ्यास कहता है कि आपको कस्टममॉडल सेवा अनुबंध का उपयोग करना होगा। सेवा अनुबंध डेटा इंटरफेस (जैसे CustomModelInterface) और सेवा इंटरफेस (जैसे CustomModelRepositoryInterface) हैं। तो मेरा ब्लॉक इस तरह दिखता है:
/ ** @वर स्लाइडपरोसॉरिटीइंटरफेस * / संरक्षित $ स्लाइडरिपोसिटरी; / ** * कस्टमब्लॉक कंस्ट्रक्टर * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / सार्वजनिक समारोह __construct ( ... CustomModelRepositoryInterface $ customModelRepository ... ) { $ यह-> customModelRepository = $ customModelRepository; } सार्वजनिक समारोह getCustomModel ($ आईडी) { $ यह लौटाएँ-> customModelRepository-> get ($ id); }
सबसे पहले, हम CustomModelRepositoryInterface
कंस्ट्रक्टर में ऑब्जेक्ट को इंजेक्ट करते हैं और हम इसे अपनी getCustomModel()
विधि में उपयोग करते हैं ।
कक्षा Api\CustomModelRepositoryInterface
में बहुत कुछ नहीं है। आम तौर पर (लेकिन कुछ भी रोकने आप अलग करने के लिए) आप बुनियादी तरीके घोषणा करेंगे: get
, getList
, save
, delete
, deleteById
। इस विषय के उद्देश्य के लिए, नीचे केवल get
विधि घोषणा है:
/**
* Get info by id
*
* @param int $id
* @return Data\CustomModelInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($id);
ठीक है, लेकिन अगर मेरे कस्टम निर्माता ने अपने ब्लॉक कंस्ट्रक्टर में निर्भरता इंजेक्शन द्वारा बुलाया है, तो कोड कहां है? इस सवाल के जवाब के लिए आपको मैगेंटो को समझाना होगा जहां इस इंटरफ़ेस को लागू करने वाला वर्ग ढूंढें। मॉड्यूल के etc / di.xml फ़ाइल में, आपको जोड़ना होगा:
<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />
इसलिए CustomModelRepositoryInterface
क्लास एक सर्विस इंटरफेस है। इसे लागू करने में आपको डेटा इंटरफेस (कम से कम Vendor\Module\Api\Data\CustomModelInterface
और Vendor\Module\Api\Data\CustomModelSearchResultsInterface
) भी लागू करना होगा । आपके मॉडल को लागू करना होगा Vendor\Module\Api\Data\CustomModelInterface
और <preference ... />
आपके प्रत्येक इंटरफेस के लिए लाइनें जोड़ना होगा । अंत में किसी भी समय आप सेवा अनुबंध का उपयोग करते हैं, mySomethingInterface
अब और नहीं में सोचें mySomething
: मैगनेटो को di.xml
वरीयता तंत्र का उपयोग करने दें ।
ठीक है, आगे क्या आता है? जैसे ही हम CustomModelRepositoryInterface
ब्लॉक कंस्ट्रक्टर में इंजेक्ट करते हैं, हमें एक CustomModelRepository
ऑब्जेक्ट मिलता है। CustomModelRepository
में घोषित विधि को लागू करना है CustomModelRepositoryInterface
। तो हम इस में है Vendor\Module\Model\CustomModelRepository
:
सार्वजनिक समारोह ($ आईडी) { $ customModel = $ this-> customModelFactory-> create (); $ CustomModel-> लोड ($ आईडी); अगर ($ customModel-> getId ()) { नई NoSuchEntityException (__ ""% 1 "आईडी के साथ कस्टममॉडल मौजूद नहीं है। ', $ id); } $ customModel वापस; }
हम क्या कर रहे हैं ? हम CustomModel
कारखाने के लिए एक खाली वस्तु धन्यवाद बनाते हैं । अगला हम लोड CustomModel
मॉडल विधि का उपयोग करके डेटा लोड करते हैं। इसके बाद हम वापस लौटते हैं NoSuchEntityException
अगर हम CustomModel
परम में आईडी के साथ लोड करने में विफल रहे । लेकिन अगर सब कुछ ठीक है, तो हम मॉडल ऑब्जेक्ट वापस करते हैं और जीवन जारी रहता है।
लेकिन वाह ...! इस उदाहरण में वह क्या है?
$customModel->load($id);
load
शुरुआत से ही एक ही पदावनत विधि नहीं है ? हाँ यही है। मुझे लगता है कि यह शर्म की बात है, लेकिन आपको इसे इस लोड के बाद से उपयोग करना होगा () विधि कुछ प्रेषण हैं और डेवलपर उनके लिए सुन सकता है (नीचे राफेल का जवाब देखें)।
भविष्य में, हम इकाई प्रबंधक द्वारा बचत करेंगे। यह एक नई मैगेंटो 2 अवधारणा के रूप में एक और कहानी है, लेकिन यदि आप एक आंख को छोड़ना चाहते हैं, तो एंटिटी मैनेजर सीएमएस पेज के संसाधन मॉडल (v2.1) में पहले से ही लागू है:
public function load(AbstractModel $object, $value, $field = null)
{
$pageId = $this->getPageId($object, $value, $field);
if ($pageId) {
$this->entityManager->load($object, $pageId);
}
return $this;
}