Magento 2: कंट्रोलर एक्शन से "दृश्य" के लिए चर को पार करना


12

Magento 1 में, यदि आप अपने कंट्रोलर एक्शन से "व्यू" तक डेटा पास करना चाहते हैं (यानी आपके लेआउट में एक ब्लॉक, आप कर सकते हैं)

  1. वैश्विक रजिस्ट्री के माध्यम से एक मूल्य / वस्तु जोड़ें Mage::register

  2. सीधे एक ब्लॉक ऑब्जेक्ट लाएं और चलाने के बाद प्राप्त ब्लॉक ऑब्जेक्ट पर डेटा गुण सेट करें loadLayout

  3. phtmlफ़ाइलों में ब्लॉक ऑब्जेक्ट्स पर कॉल विधि , और ब्लॉक ऑब्जेक्ट्स कंट्रोलर एक्शन में पहले से सेव किए गए डेटा को पढ़ने के लिए मॉडल / डेटाबेस लेयर का उपयोग करते हैं

डेटाबेस से पढ़ने के लिए ब्लॉक ऑब्जेक्ट विधियों का उपयोग करना अभी भी Magento 2 में काम करने के लिए प्रकट होता है - जो कुछ प्रकार के संचालन के लिए उपयुक्त है। हालाँकि,

  1. Magento 2 में एक वैश्विक रजिस्ट्री नहीं है (या वहाँ है?)

  2. लेआउट सिस्टम अब एक फैक्ट्री के माध्यम से एक पेज ऑब्जेक्ट बनाकर काम करता है, और आप उसी तरह से संदर्भों को ब्लॉक नहीं कर सकते हैं जिस तरह से आप Magento 1 में कर सकते हैं

क्या यह संभव है कि मैगेंटो 2 में कंट्रोलर एक्शन से डेटा को सीधे किसी दृश्य में पास किया जा सके? या यह भी Magento के बहादुर नए डिजाइन पैटर्न ™ दुनिया के लिए एक पैटर्न प्रत्यक्ष है? यदि यह बहुत ही प्रत्यक्ष है, तो एक टेम्प्लेट में प्रदर्शित की जाने वाली कुछ गणना की हुई जानकारी के लिए क्या करना चाहिए, लेकिन क्या करना चाहिए, लेकिन उस जानकारी को एक स्टेटफुल सिस्टम में स्टोर नहीं करना चाहिए (अर्थात हम इसे सहेजना नहीं चाहते हैं। डेटाबेस)

मैं खुद को एक साथ हैक करने के लिए कुछ अलग तरीके के बारे में सोच सकता हूं - लेकिन मुझे इस बात में दिलचस्पी है कि मैगेंटो 2 आपको कैसे करना चाहता है।

नोट : मुझे एहसास है कि इस तरह से कुछ का उपयोग कर एक नियंत्रक कार्रवाई में एक ब्लॉक उदाहरण प्राप्त करना संभव है

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

Magento 2 कोर कोड अक्सर ऐसा करता है। हालाँकि - कंट्रोलर ऑब्जेक्ट में प्राप्त ब्लॉक ऑब्जेक्ट एक अलग ऑब्जेक्ट लगती है, जो phtmlटेम्पलेट के माध्यम से उपलब्ध होती है $thisया $block(पूर्व $this) ऑब्जेक्ट प्रतीत होती है जो वास्तव में टेम्पलेट को प्रस्तुत करता है, जबकि बाद में ( $block) प्रतीत होता है Magento ब्लॉक प्रकार की एक आवृत्ति)।

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

मैं कहता हूं "प्रतीत होता है" क्योंकि अगर मैं नियंत्रक क्रिया विधि में डेटा सेट करता हूं, तो यह phtmlटेम्पलेट में उपलब्ध नहीं है - और यदि मैं spl_object_hashऊपर दिए गए परिणामों की तुलना करता हूं, तो मुझे तीन अलग-अलग हैश मिलते हैं। हालाँकि, मैं इस सब के लिए काफी नया हूँ कि उपरोक्त कुछ अन्य त्रुटि हो सकती है - इसलिए यदि आप ब्लॉक पर डेटा सेट करने में सक्षम हैं और इसे एक टेम्पलेट में लाना चाहते हैं तो मुझे इसके बारे में सुनना अच्छा लगेगा !

जवाबों:


17

# 1 के बारे में, रजिस्ट्री अभी भी मौजूद है, जिसे आप Magento 1 से जानते हैं, बहुत समान है। देख:\Magento\Framework\Registry

निर्भरता इंजेक्शन के माध्यम से इसे अपने कंस्ट्रक्टर में जोड़ें, और फिर आप डेटा को स्टोर / एक्सेस करने के लिए अपने परिचित $registry->register($key, $value)और $registry->registry($key)तरीकों का उपयोग कर सकते हैं ।

यदि आप पहले से ही नहीं है तो मैं \ Magento \ फ्रेमवर्क नामस्थान के आसपास प्रहार करने की सलाह दूंगा। Mage या App से बहुत कुछ जो पहले सुलभ था, अभी भी है, बस अलग हो गया।

जहाँ तक सर्वोत्तम प्रथाओं का सवाल है, मैं इसका उत्तर नहीं दे सकता, लेकिन मुझे उम्मीद है कि उत्तर को तर्क से जितना संभव हो सके उतना ही रखना होगा। कोर को देखते हुए शायद आपका सबसे अच्छा दांव है। उदाहरण के लिए, ग्राहक पता संपादित पृष्ठ देखें: मूल नियंत्रक ; व्यापक ब्लॉक - पता आईडी खींचना और लोड करना, यदि आवश्यक हो। वे सीधे ब्लॉक में संभालते हैं; वे इसे नियंत्रक में नहीं करते हैं और फिर इसे पास करते हैं।


2
चाल, निश्चित रूप से, यह जानने के लिए कि कोर के लिए कौन से भागों को देखना है, और जो अनदेखा करना है :) बिंदुओं के लिए धन्यवाद, उपयोगी जानकारी के लिए +1!
एलन स्टॉर्म

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

@AntonKril पेज रेंडर हेल्पर्स के बारे में कैसे? CMS पेज हेल्पर, उत्पाद दृश्य सहायक, जो HTTP अनुरोध से रेंडरिंग को अलग करने के लिए हैं?
इवान चेपर्नी

5

आपको व्यूअर को कंट्रोलर एक्शन से व्यू में पास नहीं करना चाहिए । वेरिएबल्स टू व्यू (टेम्पलेट इंजन) पास करने के लिए ब्लॉक का उपयोग करें।


क्यों? आप ब्लॉक / पोस्ट पार्म्स को देखने के लिए कैसे पास कर सकते हैं? क्या अधिकांश तर्क उन्हें नियंत्रक से देखने के लिए नहीं दे रहे हैं?
लुकस्कु

ब्लॉक में अनुरोध ऑब्जेक्ट का उपयोग करें। यदि आप रजिस्ट्री के माध्यम से नियंत्रक से डेटा प्राप्त करते हैं, तो आप इसे अन्य नियंत्रकों के साथ ब्लॉक का उपयोग नहीं कर सकते। इसे टेम्पोरल कपलिंग और इसके बुरे व्यवहार कहा जाता है
KAndy

मैं नियंत्रक से ब्लॉक तक अनुरोध के पैरामेट्स पारित करने के लिए $ ब्लॉक-> असाइन () का उपयोग करता हूं। क्या यह भी एक बुरी प्रथा है?
लुकस्क्यू

कार्रवाई से ब्लॉक का प्रत्यक्ष पता भी हतोत्साहित किया जाता है क्योंकि यदि पृष्ठ पर ब्लॉक मौजूद है तो आप कभी भी सुनिश्चित नहीं होंगे।
कांडी

मेरे मामले में, मुझे यकीन है, क्योंकि यह एक कस्टम परिदृश्य है जहां नियंत्रक, लेआउट और ब्लॉक केवल मेरे कोड द्वारा नियंत्रित होते हैं, इसलिए मुझे लगता है कि नियंत्रक से ब्लॉक करने के लिए लॉजिक पास अनुरोध के परमस हैं। अपने जवाब के लिए thx!
लुकस्कु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.