2011-09-02 18 views
6

मैं इस अनुप्रयोग है कि मॉडल परत में सत्र चर तक पहुँचता है पर काम कर रहा हूँ एक्सेस किया जाना है। यह सिर्फ गलत लगता है लेकिन गलत साबित होने के लिए तैयार हूं। शायद गलत नहीं है, लेकिन ऐप में अधिकांश स्थानों में, सत्र चर को नियंत्रक में संभाला जाता है और तर्क के रूप में पारित किया जाता है, लेकिन अन्य स्थानों पर, सत्र मान को अभी तक एक्सेस किया जाता है। क्या मैं गलत हूं कि यह बुरा अभ्यास की तरह लगता है?Zend फ्रेमवर्क आवेदन डिजाइन - सत्र चर मॉडल परत

संपादित करें: एक कारण मैं मॉडल में सत्र पसंद नहीं है कि यह यह और अधिक जटिल परीक्षण करने के लिए बनाने के लिए लगता है। इसे केवल कार्यों के लिए पारित पैराम के रूप में रखें और फिर रिकॉर्डसेट वापस पास हो गया।

thx

+4

एक पल के लिए सोचें कि आप कमांड लाइन स्क्रिप्ट में अपने मॉडल का उपयोग करना चाहते हैं: कोई सत्र नहीं। या एक इकाई परीक्षण में। यदि आपको कुछ डेटा चाहिए जो * सत्र से आ सकता है, तो उस ऑब्जेक्ट के अंदर बेहतर छुपाएं जिसे आप परीक्षण या कमांड लाइन उपयोग के मामले में नकल कर सकते हैं। –

+0

ऐसी बात मत करो! डेटा परत एक बात है, व्यापार तर्क दूसरे। Zend_Registry insted या यहां तक ​​कि डेटा मैपर का उपयोग करें। –

उत्तर

4

यह निर्भर करता है।

तरह से मैं इस बारे में सोचते ऐसी है:

  1. एक मॉडल आपका डेटा स्तर का प्रतिनिधित्व करता है।
  2. अधिकांश समय डेटा परत डीबी टेबल आधारित
  3. सत्र एक और डेटा संग्रहण माध्यम है।
  4. निष्कर्ष: डेटा है कि अपने मॉडल का प्रतिनिधित्व करता है सत्र में संग्रहीत किया जाता है, की तुलना में यह ठीक है मॉडल

एक उदाहरण के भीतर से है कि डेटा तक पहुंचने का सत्र आधारित खरीदारी की टोकरी है। मेरे कार्ट की ऑब्जेक्ट्स मेरे सत्र डेटा के मॉडल हैं।

+0

पर्याप्त मेला। लेकिन मैं अभी भी सत्र ऑब्जेक्ट के लिए गेटर/सेटर जोड़ूंगा ताकि मैं बाद में नकल कर सकूं। –

+0

जो मुद्दा मैं इस ऐप में देख रहा हूं (और इसलिए मूल प्रेरणा) यह है कि # 3 # 2 नहीं है, या अधिक सहकारी रूप से, डीबी और केवल PHP के सत्र तंत्र तक नहीं रहा है। असल में आप लटकते संदर्भ प्राप्त कर रहे हैं। इस मामले में या तो यह समझने के लिए और अधिक समझदारी होगी कि इन विशिष्ट तरीकों को तब तक नहीं बुलाया जाएगा जब तक कोई sess-> user_id चर (यानी एआर नियंत्रक स्तर) किया जाता है या मॉडल कन्स्ट्रक्टर/प्रारंभिकरण के माध्यम से प्रबंधित करता है या नहीं एक sess-> user_id है। परीक्षण और क्ली (जिनमें से दोनों का उपयोग किया जाता है) के मुद्दों के संदर्भ में, मैं मैनुअल सेस मान बना सकता हूं। – timpone

+0

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

2

नियंत्रक एस एच डी एक चेक मौसम सत्र भी मौजूद हैं या मॉडल है जो इसके अंदर उस सत्र का उपयोग करता है उपयोग करने से पहले नहीं।

+0

मैंने इसे देखा है लेकिन यह अन्य मॉडलों वाले मॉडल की समस्या में चलता है। क्या होगा यदि किसी अन्य मॉडल के भीतर उपयोग किया जाने वाला मॉडल सत्र चर का उपयोग करता है? ऐसा लगता है कि वास्तव में नियंत्रक में क्या होना चाहिए इसका प्रबंधन करने के लिए नियंत्रक में बहुत सारे कोड लिखना पसंद है। आपके साथ असहमत होने से ज़ोर से अधिक सोच। मॉडल के पैरामीटर के रूप में सत्र पारित करते समय – timpone

+0

@timpone आपको अभी भी नियंत्रक में सभी चेक करना होगा। जैसा कि नाम कहता है कि नियंत्रक नौकरी तर्क के ऊपर नियंत्रण प्रदान करना है जो मॉडल के अंदर जाती है। –

+0

+1 सहमत हैं, आपको मॉडलों में सत्र की जांच करने की आवश्यकता नहीं है, यह प्लग-इन नौकरी है। शायद आप अपने वास्तुकला में कुछ खो रहे हैं। अन्यथा, यह एक Zend_Registry नौकरी है। –

0

क्या सत्र चर में संग्रहीत है? अगर यह बस 'लॉग इन है? वाई/एन ', तो उन्हें शायद मॉडल परत का हिस्सा बनने की आवश्यकता नहीं है। यदि, हालांकि, यह उससे अधिक जटिल है, तो संभवतः वे आपके व्यापार मॉडल से अनजाने में जुड़े हुए हैं और इन्हें इस तरह माना जाना चाहिए।

Zend टेस्ट प्रलेखन शो एक लॉगिन फ़ंक्शन का उपयोग पूर्ण MVC परीक्षण करने के लिए कैसे के तल पर उदाहरण। संभवतः आप मॉडलों का परीक्षण करते समय भी ऐसा ही कर सकते हैं?

+0

thx को इंगित करने के लिए thx; मुझे लगता है कि यह सब कुछ निर्भर करता है। एक जटिल ऐप में, यह आपदा के लिए एक नुस्खा की तरह लगता है। आम तौर पर, मुझे लगता है कि मैं हमेशा डेटा की कुछ क्ली प्रोसेसिंग करना चाहता हूं या तो इसे साफ़ करने के लिए और असली सत्र चर होने से जटिल हो। क्या यह किया जा सकता है? हाँ यह किया जाना चाहिए? निश्चित नहीं – timpone

0

नहीं, यह नहीं होना चाहिए। भंडारण प्रकार, आपके व्यापार तर्क से अलग होना चाहिए। उदाहरण के लिए:

मेरे पास एक साधारण प्लग-इन है जो एक्सेस चेक निष्पादित करता है और उपयोगकर्ता ऑब्जेक्ट को रजिस्ट्री पर रखता है। इसलिए, एक्सेस सत्र के बजाय, मॉडल को रजिस्ट्री तक पहुंच है, जो अच्छी तरह से परिभाषित है।

$User = Zend_Registry::get('User'); // User model object

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

यदि आप अपना डेटा प्राप्त करने के लिए एक से अधिक पथ ले रहे हैं, तो शायद यह आपके कंप्यूटर के बड़े होने पर कुछ समस्याएं पैदा करेगा।

OOP और स्तरित सिस्टम दृष्टिकोण सुझाव बनाई गई विशेष वस्तुओं और परतों के लिए है और सभी कोड में फैला दिया करने के लिए विशिष्ट कार्यों को रोकने साधारण चीजें रखने के लिए।

लेकिन फिर भी, जब तक आप लाभ नहीं देखते हैं तब तक आपको इसे बदलने की आवश्यकता नहीं है। ध्यान रखें कि कभी-कभी रीफैक्टरिंग सब कुछ भविष्यवाणी करने की कोशिश करने से अधिक कुशल होती है।

संबंधित मुद्दे