2013-06-27 11 views
5

मैं सिंगलटन ऑब्जेक्ट बनाकर लैरावेल आईओसी का उपयोग करने की कोशिश कर रहा हूं। मैं नीचे के रूप में ट्यूटोरियल से पैटर्न का पालन कर रहा हूँ। मैंने ऑब्जेक्ट में लॉग संदेश डाला है (इस उदाहरण में फूबर) कन्स्ट्रक्टर और मैं देख सकता हूं कि जब भी मैं ब्राउज़र में पेज रीफ्रेश करता हूं तो ऑब्जेक्ट बनाया जा रहा है। लैरावेल IoC के लिए सिंगलटन पैटर्न कैसा है? मैं समझ गया कि पूरे एप्लिकेशन के लिए इसकी साझा वस्तु है लेकिन यह स्पष्ट रूप से ऐप द्वारा अनुरोध किए जाने पर हर बार बनाया जा रहा है: बनाना (...) क्या कोई कृपया समझा सकता है। मैंने सोचा कि मैं साझा मोंगोडीबी कनेक्शन को बनाए रखने के लिए सिंगलटन पैटर्न का उपयोग करूंगा।लैरवेल आईओसी और सिंगलटन पैटर्न

App::singleton('foo', function() 
{ 
    return new FooBar; 
}); 

उत्तर

25

क्या Laravel Doc

कभी कभी में कहा गया है, आप कंटेनर कि केवल एक बार सुलझाया जाना चाहिए में कुछ बाध्य करने के लिए इच्छा हो सकती है, और एक ही उदाहरण कंटेनर में आगामी कॉल पर लौटे किया जाना चाहिए:

इस तरह आप एक singleton वस्तु बाध्य कर सकते हैं और आप इसे सही

App::singleton('foo', function() 
{ 
    return new FooBar; 
}); 
किया है

लेकिन, समस्या यह है कि आप request और response की गलत प्रक्रिया में पूरी प्रक्रिया सोच रहे हैं। आपने उल्लेख किया है कि,

मैं देख सकता हूं कि जब भी मैं ब्राउज़र में पृष्ठ रीफ्रेश करता हूं तो ऑब्जेक्ट बनाया जा रहा है।

खैर, यह HTTP अनुरोध के सामान्य व्यवहार है क्योंकि हर बार जब आप पेज ताज़ा कर रहे हैं हर बार जब आप एक नया अनुरोध और हर बार आवेदन बूट और अनुरोध संसाधित भेज रहे हैं आपके द्वारा भेजे गए और अंत में किया है इसका मतलब है , एक बार जब एप्लिकेशन आपके ब्राउज़र में प्रतिक्रिया भेजता है, तो यह काम समाप्त हो जाता है, सर्वर में कुछ भी नहीं रखा जाता है (सत्र, कुकी लगातार और अलग होती है)।

अब यह कहा गया है कि the same instance should be returned on subsequent calls, इस मामले में, बाद की कॉल का मतलब है कि, अगर आप उसी अनुरोध पर App::make(...) पर कई बार आवेदन करते हैं, तो आवेदन के एकल जीवन चक्र में यह नए उदाहरण नहीं देगा हर बार।उदाहरण के लिए, यदि आप दो बार इस

App::before(function($request) 
{ 
    App::singleton('myApp', function(){ ... }); 
}); 

की तरह कुछ एक ही अनुरोध में कहते हैं, अपने नियंत्रक में, लिए, आपको पहले

class HomeController { 
    public function showWelcome() 
    { 
     App::make('myApp'); // new instance will be returned 
     // ... 
    } 
} 

पर कॉल और फिर आप after फिल्टर दूसरी बार में इसे कहते

App::after(function($request, $response) 
{ 
    App::make('myApp'); // Application will check for an instance and if found, it'll be returned 
}); 

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

+0

इस तरह के विस्तृत स्पष्टीकरण के लिए धन्यवाद। मैं जावा दुनिया से आ रहा हूं जहां आईओसी कंटेनर और सिंगलटन का थोड़ा अलग अर्थ है। अब यह मेरे लिए स्पष्ट है। लेकिन उदाहरण के लिए एक पैटर्न क्या है मेरे आवेदन में कई अनुरोधों के लिए डीबी कनेक्शन साझाकरण। जैसे जब मैं MongoDb का उपयोग करता हूं और सर्वर के लिए एक पूल कनेक्शन चाहता हूं जिसे प्रत्येक अनुरोध के लिए एक नया कनेक्शन बनाने के बजाय अनुरोधों के बीच साझा किया जाता है ...? –

+1

आपका स्वागत है :-) बस कोशिश करें [यह] (https://github.com/jenssegers/Laravel-MongoDB)। –

+2

@ वेरवॉल्फ-द एल्फा द्वारा महान स्पष्टीकरण के लिए वोट-अप, बहुत बहुत धन्यवाद – antoniputra

0

यह अनुप्रयोग अनुप्रयोगों के दौरान कई बार उपयोग किया जाना है। प्रत्येक बार जब आप पृष्ठ को रीफ्रेश करते हैं, तो यह एप्लिकेशन का एक नया उदाहरण है।

अधिक जानकारी और व्यावहारिक उपयोग के लिए इस चेक आउट: http://codehappy.daylerees.com/ioc-container

यह L3 के लिए लिखा है, लेकिन एक ही L4 के लिए लागू होता है।

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