2008-09-05 19 views
18

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

उत्तर

14

सामान्य रूप से, आप किसी ऑब्जेक्ट के अंदर ऑब्जेक्ट्स बनाना नहीं चाहते हैं। यह एक बुरी आदत है, इसके बजाय, एक स्पष्ट एपीआई लिखें और अपने मॉडल में एक मॉडल इंजेक्ट करें।

<?php 
// in your controller 
$model1 = new Model1(); 
$model2 = new Model2(); 
$model2->setWhatever($model1); 
?> 
+0

क्या यह एक अच्छा अभ्यास है? क्योंकि मॉडल 2 के उपयोगकर्ता को यह जानना है कि यह मॉडल 1 पर निर्भर है। अच्छा अभ्यास क्या है? – Sabya

+2

हां, निर्भरता को "इंजेक्ट" करने के लिए बेहतर अभ्यास, बनाम मॉडल 1 के अंदर मॉडल 2 को प्रारंभ करना। – Till

+0

यह एक DRY दृष्टिकोण से अच्छा नहीं लगता है। क्या होगा यदि मेरे पास कोई ऐसा फ़ंक्शन है जो एक मॉडल के पहलू को बदलता है और किसी अन्य मॉडल के लिए एक क्रिया को ट्रिगर करता है? – wag2639

1

अपने मॉडल में प्रमाणीकरण संभाल न करें। केवल अपने डेटाबेस, या ldap या जो कुछ भी के साथ इंटरफेस करने के लिए मॉडल का उपयोग करें।

मैंने एक ऑथ लाइब्रेरी बनाई है जिसका उपयोग मैं प्रमाणीकरण और प्रमाणीकरण को प्रबंधित करने के लिए करता हूं। आप अपने नियंत्रकों से इस तरह की लाइब्रेरी तक पहुंच सकते हैं।

+0

मैं हमेशा एक मॉडल के अंदर अपने ओथ कार्यान्वयन डालता हूं, मुझे प्रमाणीकरण कोड –

+0

के साथ अपने नियंत्रकों को मकिंग करना पसंद नहीं है, मैं एक MY_controller बना देता हूं और वहां सब कुछ करता हूं। – tomexsans

18

ऐसा लगता है कि आप मॉडल के अंदर मॉडल लोड कर सकते हैं, हालांकि आपको शायद इसे किसी अन्य तरीके से हल करना चाहिए। एक चर्चा के लिए CodeIgniter forums देखें।

class SomeModel extends Model 
{ 
    function doSomething($foo) 
    { 
    $CI =& get_instance(); 
    $CI->load->model('SomeOtherModel','NiceName',true); 

    // use $CI instead of $this to query the other models 
    $CI->NiceName->doSomethingElse(); 
    } 
} 

इसके अलावा, मुझे नहीं पता कि टिल क्या कह रहा है कि आपको वस्तुओं के अंदर वस्तुओं को नहीं बनाना चाहिए। बेशक आपको चाहिए! ऑब्जेक्ट्स भेजना तर्क के रूप में मुझे बहुत कम स्पष्ट दिखता है।

+3

शिकायत यह है कि ऐसा करने से अनावश्यक रूप से एक मजबूत निर्भरता पैदा होती है जो दो मॉडलों को betweeen बनाता है। जब आप परीक्षण कर रहे हों, उदाहरण के लिए, SomeModel को SomeOtherModel का एक नकली संस्करण देने में सक्षम होना अच्छा लगता है; यदि आप पूर्व को बाद में लोड कर रहे हैं तो आप ऐसा नहीं कर सकते हैं। या फिर आप उसी इंटरफ़ेस के साथ एक अलग मॉडल का उपयोग करने के लिए कोड को संशोधित करते हैं, जैसे कि जब आप प्लगइन सिस्टम का उपयोग करने के लिए मौजूदा कोड को दोबारा कर रहे हों। –

+1

Google का एक ओपन सोर्स निर्भरता इंजेक्शन ढांचा है। यह जावा के लिए है लेकिन यह पेशेवरों और निर्भरता इंजेक्शन के कुछ विपक्ष बताता है। http://code.google.com/p/google-guice/ –

+1

@ रोब हावर्ड इस तरह की चीज है कि निर्भरता इंजेक्शन बहुत दूर है। आपके द्वारा उपयोग की जाने वाली प्रत्येक वस्तु को इंजेक्ट करना आवश्यक नहीं है, क्योंकि आपके द्वारा उपयोग की जाने वाली प्रत्येक वस्तु को अलगाव में परीक्षण करने की आवश्यकता नहीं है। इसके बजाय आप उन प्रणालियों और मॉड्यूल का परीक्षण करना चाहते हैं जो पूरी तरह से मिलकर काम करते हैं और उन्हें एक दूसरे से अलग करने और इंजेक्शन की आवश्यकता होती है। –

1

मॉडल के भीतर एक मॉडल लोड करना अब नए कोडइग्निटर के साथ संभव है।

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