Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Laravel
Code

Laravel सर्विस प्रोवाइडर का प्रयोग और रजिस्टर कैसे करें

by
Difficulty:IntermediateLength:LongLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

यदि आप कभी भी Laravel फ़्रेमवर्क में आए हैं, तो यह बिलकुल न के बराबर संभावना है कि आपने सर्विस कंटेनरों और सर्विस प्रोवाइडर्स के बारे में नहीं सुना है। वास्तव में, वे Laravel फ़्रेमवर्क की रीढ़ हैं और जब आप किसी भी Laravel एप्लिकेशन का उदाहरण पेश करते हैं तो यह सभी भारी भार उठाते हैं।

इस आर्टिकल में, हम इस बारे में एक झलक देते हैं कि सर्विस कंटेनर आखिर होता क्या है, और इसके बाद हम सर्विस प्रोवाइडर पर विस्तार से चर्चा करेंगे। इस आर्टिकल के पाठ्यक्रम में, मैं यह भी प्रदर्शित करूँगा कि कैसे Laravel में एक कस्टम सर्विस प्रोवाइडर बनाते है। एक बार जब आप एक सर्विस प्रोवाइडर बनाते हैं, तो आपको इसका उपयोग करने के लिए Laravel एप्लिकेशन के साथ भी रजिस्टर करना होगा, इसलिए हम उस माध्यम से भी जायेंगे।

दो महत्वपूर्ण तरीके हैं, बूट और रजिस्टर, जो कि आपका सर्विस प्रोवाइडर इम्प्लीमेंट कर सकता है, और इस लेख के अंतिम सेगमेंट में हम इन दो विधियों को अच्छी तरह से चर्चा करेंगे।

इससे पहले कि हम किसी सर्विस प्रोवाइडर की चर्चा में डुबकी लगाएं, मैं सर्विस कंटेनर को शुरू करने का प्रयास करूंगा क्योंकि यह आपके सर्विस प्रोवाइडर इम्प्लीमेंटेशन में भारी इस्तेमाल किया जाएगा।

सर्विस कंटेनर और सर्विस प्रोवाइडर को समझें

एक सर्विस कंटेनर क्या है?

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

आधिकारिक Laravel डॉक्यूमेंटेशन के शब्दों में:

Laravel सर्विस कंटेनर class dependencies के मैनेजिंग और डिपेंडेंसी इंजेक्शन परफॉर्म करने के लिए एक शक्तिशाली टूल है।

इसलिए, जब भी आपको किसी बिल्ट-इन कॉम्पोनेन्ट या सर्विस को इंजेक्ट करने की आवश्यकता होती है, तो आप इसे अपने कन्स्ट्रक्टर या मेथड में लिख सकते हैं, और इसे सर्विस कंटेनर से ऑटोमेटिकली इंजेक्ट किया जाएगा क्योंकि इसमें आपकी ज़रूरत का सब कुछ है! क्या यह कूल नहीं है? यह आपको मैन्युअल रूप से कॉम्पोनेन्ट को इनस्टॉल करने से बचाता है और इस प्रकार आपके कोड टाइट कपलिंग से बचा जाता है।

इसे समझने के लिए एक क्विक उदाहरण देखें।

जैसा कि आप देख सकते हैं, SomeClass को अपने आप को instantiate करने के लिए FooBar के एक इंस्टैंस की आवश्यकता है। इसलिए, मूलतः, इसमें एक डिपेंडेंसी है जिसे इंजेक्ट किये जाने की आवश्यकता है। Laravel सर्विस कंटेनर में देखकर और उचित डिपेंडेंसी को इंजेक्शन करके ऑटोमेटिकली करता है।

और अगर आप सोच रहे हैं कि कैसे Laravel जानता है कि सर्विस कंटेनर में किन कंपोनेंट्स या सर्विसेज को शामिल करना है, तो उत्तर सर्विस प्रोवाइडर है। यह सर्विस प्रोवाइडर है जो सर्विस कंटेनर में विभिन्न कंपोनेंट्स को बांधने के लिए Laravel को बताता है। वास्तव में, इसे सर्विस कंटेनर बाइंडिंग कहा जाता है, और आपको इसे सर्विस प्रोवाइडर के माध्यम से करना होगा।

इसलिए यह सर्विस प्रोवाइडर है जो सभी सर्विस कंटेनर बाइंडिंग रजिस्टर करता है, और यह सर्विस प्रोवाइडर इम्प्लीमेंटेशन के रजिस्टर मेथड के माध्यम से किया जाता है।

टेबल पर एक और सवाल लाना चाहिए: Laravel को कैसे विभिन्न सर्विस प्रोवाइडर्स के बारे में पता है? क्या आपने अभी कुछ कहा है? मैंने अभी किसी को यह कहते हुए सुना है कि, Laravel को स्वयं को भी यह समझना चाहिए! ओह बॉय, यह पूछने के लिए बहुत कुछ है: Laravel एक फ्रेमवर्क है जो सुपरमैन नहीं है, है ना? मजाक को अलग करें, ऐसा कुछ है जो आपको स्पष्ट रूप से Laravel को सूचित करने की ज़रूरत है।

आगे बढ़ो और config/app.php फ़ाइल के कंटेंट को देखें। आपको एक ऐरे एंट्री मिलेगी जो कि सभी सर्विस प्रोवाइडर्स को लिस्ट करती है जो कि Laravel एप्लिकेशन के बूटस्ट्रिपिंग के दौरान लोड हो जाएंगी।

इसलिए, यह आपके डिस्पोजल में सर्विस कंटेनर था। अगले सेक्शन से, हम सर्विस प्रोवाइडर पर ध्यान देंगे, जो इस आर्टिकल का मुख्य विषय है!

सर्विस प्रोवाइडर क्या है?

यदि सर्विस कंटेनर कुछ है जो आपको बाइंडिंग को परिभाषित करने और इंजेक्ट डिपेंडेंसी डिफाइन करने की अनुमति देता है, तो सर्विस प्रोवाइडर वह जगह है जहां यह होता है।

यह समझने के लिए कि यह क्या करता है, कोर सर्विस प्रोवाइडर्स में से एक पर जल्दी से एक नज़र डालते है। आगे बढ़ो और vender/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php फ़ाइल खोलें।

यहां नोट करने के लिए महत्वपूर्ण बात यह है कि आप रजिस्टर मेथड को सर्विस कन्टेनर बाइंडिंग को डिफाइन करने की अनुमति देते हैं। जैसा कि आप देख सकते हैं, cache, cache.store और memcached.connector सर्विसेज के लिए तीन बाइंडिंग हैं।

असल में, हम Laravel को सूचित कर रहे हैं कि जब भी cache एंट्री को हल करने की आवश्यकता होती है, तो उसे CacheManager के इंस्टैंस को रीटर्न करना चाहिए। इसलिए हम सर्विस कंटेनर में बस एक प्रकार की मैपिंग जोड़ रहे हैं जिसे $this->app के माध्यम से एक्सेस किया जा सकता है।

Laravel सर्विस कंटेनर में किसी भी सर्विस को जोड़ने का यह उचित तरीका है। यह आपको Laravel के सभी सर्विस प्रोवाइडर्स के रजिस्टर मेथड के माध्यम से कैसे चलाता है और सेवा कंटेनर को प्रदर्शित करता है की बड़ी तस्वीर को समझने की अनुमति देता है! और जैसा कि हमने पहले उल्लेख किया है, यह config/app.php फ़ाइल से सर्विस प्रोवाइडर्स की लिस्ट को चुनता है।

और यह ही सर्विस प्रोवाइडर की कहानी है। अगले सेक्शन में, हम एक कस्टम सर्विस प्रोवाइडर बनाने के बारे में चर्चा करेंगे ताकि आप अपनी कस्टम सर्विसेज को Laravel सर्विस कंटेनर में रजिस्टर कर सकें।

अपना कस्टम सर्विस प्रोवाइडर बनाएं

Laravel पहले से ही हैंड्स-ऑन कमांड-लाइन यूटिलिटी टूल, artisan के साथ आता है, जो आपको टेम्पलेट कोड बनाने की अनुमति देता है ताकि आप इसे स्क्रैच से न बनाएं। आगे बढ़ो और कमांड लाइन पर जाओ और एक कस्टम सर्विस प्रोवाइडर बनाने के लिए अपने एप्लिकेशन रूट में निम्न कमांड चलाएं।

और इसे app/Providers डायरेक्टरी के अंदर EnvatoCustomServiceProvider.php फाइल बनानी चाहिए। यह देखने के लिए फ़ाइल खोलें कि यह कैसा है।

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

register मेथड वह जगह है जहां आप अपने सभी कस्टम सर्विस कंटेनर बाइंडिंग को डिफाइन करते हैं। दूसरी तरफ, boot मेथड वह जगह है जहां आप रजिस्टर मेथड के माध्यम से पहले से ही रजिस्टर सर्विसेज का उपभोग कर सकते हैं। इस आर्टिकल के अंतिम सेगमेंट में, हम इन दो मेथड्स पर विस्तार से चर्चा करेंगे क्योंकि हम कुछ प्रैक्टिकल यूज़ मामलों के माध्यम से दोनों मेथड्स के उपयोग को समझने के लिए जायेंगे।

अपने कस्टम सर्विस प्रोवाइडर को रजिस्टर करें

तो आपने अपना कस्टम सर्विस प्रोवाइडर बनाया है एक दम बढ़िया! इसके बाद, आपको अपने कस्टम सर्विस प्रोवाइडर के बारे में Laravel को सूचित करना होगा ताकि वह बूटस्ट्रैप के दौरान अन्य सर्विस प्रोवाइडर के साथ इसे लोड कर सके।

अपने सर्विस प्रोवाइडर को रजिस्टर करने के लिए, आपको config/app.php फ़ाइल में सर्विस प्रोवाइडर के ऐरे (array) में एक एंट्री जोड़नी होगी।

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

रजिस्टर और बूट मेथड्स के माध्यम से जाओ

शुरू करने के लिए, हम यह जानने के लिए register मेथड के माध्यम से जाएंगे कि आप वास्तव में इसका उपयोग कैसे कर सकते हैं। सर्विस प्रोवाइडर फ़ाइल app/Providers/EnvatoCustomServiceProvider.php खोलें जो पहले बनायीं गयी थी और मौजूदा कोड को निम्नलिखित के साथ बदलें।

यहां नोट करने के लिए दो महत्वपूर्ण बातें हैं:

  • हमने app\Library\Services\DemoOne को आयात किया है ताकि हम उसका इस्तेमाल कर सकें। DemoOne क्लास अभी तक नहीं बनायीं गयी है, लेकिन हम एक क्षण में ऐसा करेंगे।
  • रजिस्टर मेथड में, हमने सर्विस कंटेनर के bind मेथड का उपयोग हमारी सर्विस कंटेनर बाइंडिंग को जोड़ने के लिए किया है। इसलिए, जब भी app\Library\Services\DemoOne डिपेंडेंसी को हल करने की जरूरत होती है, तो यह क्लोजर फंक्शन को कॉल करता है, और यह app\Library\Services\DemoOne ऑब्जेक्ट को आरम्भ करता है और return करता है।

इसलिए आपको इस पर काम करने के लिए app/Library/Services/DemoOne.php फाइल बनाने की जरूरत है।

और यहाँ कोड है जो कहीं आपके controller में है जहां डिपेंडेंसी इंजेक्ट होगी।

यह एक class को bind करने का एक बहुत सरल उदाहरण है। वास्तव में, उपरोक्त उदाहरण में, सर्विस प्रोवाइडर बनाने और रजिस्टर मेथड को लागू करने की कोई आवश्यकता नहीं है जैसा कि हमने किया था, चूंकि Laravel स्वतः रिफ्लेक्शन के द्वारा इसे हल कर सकता है।

Laravel डॉक्यूमेंटेशन से एक बहुत ही महत्वपूर्ण नोट:

कंटेनर में क्लासेज bind करने की कोई आवश्यकता नहीं है अगर वे किसी भी इंटरफेस पर निर्भर नहीं करते हैं। कंटेनर को ये ऑब्जेक्ट बनाने के तरीके के बारे में इंस्ट्रक्शन देने की ज़रूरत नहीं है, क्योंकि यह स्वचालित रूप से रिफ्लेक्शन का उपयोग करके इन ऑब्जेक्ट को हल कर सकता है।

दूसरी ओर, यह वास्तव में उपयोगी होगा यदि आपके पास एक निश्चित इम्प्लीमेंटेशन के लिए एक इंटरफ़ेस हो। इसे समझने के लिए एक उदाहरण के माध्यम से चलें।

चलो app/Library/Services/Contracts/CustomServiceInterface.php में एक बहुत सरल इंटरफ़ेस बनाते हैं।

इसके बाद, इस इंटरफ़ेस के दो ठोस इम्प्लीमेंटेशन बनाते हैं। असल में, हमें सिर्फ दो क्लास बनाने की जरूरत है जो CustomServiceInterface इंटरफ़ेस का विस्तार करती हैं।

app/Library/Services/DemoOne.php में DemoOne क्लास बनाएं।

इसी तरह, DemoTwo app/Library/Services/DemoTwo.php में।

अब, एक क्लास को bind करने के बजाय, हम एक इंटरफ़ेस bind कर लेंगे। EnvatoCustomServiceProvider.php पर जाएं और नीचे दिखाए गए कोड को बदलें।

इस केस में, हमने App\Library\Services\Contracts\CustomServiceInterface इंटरफ़ेस को DemoOne इम्प्लीमेंटेशन के साथ bind कर दिया है। इसलिए, जब भी App\Library\Services\Contracts\CustomServiceInterface डिपेंडेंसी को हल करने की जरूरत है, यह App\Library\Services\DemoOne ऑब्जेक्ट को इंस्टनशियेट और रीटर्न करता है। अब यह अधिक समझ में आता है, है ना?

चलो जल्दी से कंट्रोलर कोड को रीवाइस करते हैं।

जैसा कि आप अनुमान लगा सकते हैं, $customServiceInstance App\Library\Services\DemoOne का इंस्टंस होना चाहिए! इस दृष्टिकोण की सुंदरता यह है कि आप DemoOne इम्प्लीमेंटेशन आसानी से दूसरे के साथ कर सकते हैं।

मान लें कि आप DemoOne के बजाय DemoTwo का उपयोग करना चाहते हैं उस स्थिति में, आपको सर्विस प्रोवाइडर EnvatoCustomServiceProvider.php में केवल निम्नलिखित परिवर्तन करने की आवश्यकता है।

निम्नलिखित लाइन को खोजें:

और इसके साथ इसे बदलें:

इसी प्रकार, यह एक ढूंढें:

इसके द्वारा रीप्लेस किया जाना चाहिए:

उसी एप्रोच का उपयोग किया जा सकता है, आप अपने स्वयं के साथ किसी भी कोर इम्प्लीमेंटेशन को बदलना चाहते हैं। और यह न सिर्फ आपकी सर्विस कंटेनर बाइंडिंग के लिए उपयोग की जाने वाला बाइंड मेथड है; Laravel सर्विस कंटेनर, सर्विस कंटेनर में bind करने के विभिन्न तरीकों को प्रदान करता है। पूर्ण रिफरेन्स के लिए कृपया ऑफिशल Laravel documentation की जांच करें।

अगला कैंडिडेट boot मेथड है, जिसका उपयोग आप कोर Laravel फंक्शनलिटी को बढ़ाने के लिए कर सकते हैं। इस मेथड में, आप सर्विस प्रोवाइडर के रजिस्टर मेथड का उपयोग करके रजिस्टर्ड सभी सर्विसेज का उपयोग कर सकते हैं। ज्यादातर मामलों में, आप इस मेथड में अपने ईवेंट लिस्टनर्स को रजिस्टर करना चाहते हैं, जो कुछ होने पर ट्रिगर हो जाएगा।

आइए कुछ उदाहरणों को देखें, जिनके लिए बूट मेथड इम्प्लीमेंटेशन की आवश्यकता होती है।

आप अपने स्वयं के कस्टम फॉर्म फ़ील्ड वैलीडेटर को Laravel में जोड़ना चाहते हैं।

क्या आप एक व्यू कंपोजर रजिस्टर करना चाहते हैं, ऐसा करने के लिए यह सही जगह है! वास्तव में, हम कह सकते हैं कि बूट मेथड अक्सर व्यू कम्पोज़र्स को जोड़ने के लिए उपयोग किया जाता है!

बेशक, आप पहले स्थान पर अपने सर्विस प्रोवाइडर में एक फसाड (facade) Illuminate\Support\Facades\View को आयात करना चाहते हैं।

उसी क्षेत्र में, आप डेटा को कई व्यूज (views) में भी साझा कर सकते हैं!

यह स्पष्ट (explicit) मॉडल बाइंडिंग को डिफाइन करने के लिए भी उपयोग किया जा सकता है।

बूट मेथॉस के उपयोग को प्रदर्शित करने के लिए ये कुछ उदाहरण थे। जितना अधिक आप Laravel में आते हैं, उतना ही अधिक कारण आपको इसे इम्प्लीमेंट करने के लिए मिलेगा!

और इसके साथ, हम इस आर्टिकल के अंत तक पहुंच चुके हैं। मुझे आशा है कि आपने उन विषयों का आनंद उठाया है जिनकी इस आर्टिकल में चर्चा हुई है।

निष्कर्ष

यह सर्विस प्रोवाइडर्स की चर्चा थी, जो इस आर्टिकल का केंद्र आकर्षण था, हालांकि हमने सर्विस कंटेनर के साथ हमारा आर्टिकल शुरू किया क्योंकि सर्विस प्रोवाइडर को समझने के लिए यह एक महत्वपूर्ण इंग्रेडिएंट था।

उसके बाद, हमने एक कस्टम सर्विस प्रोवाइडर विकसित किया, और आर्टिकल के उत्तरार्ध में हम कुछ व्यावहारिक उदाहरणों के माध्यम से चले।

आप में से जो लोग या तो Laravel के साथ शुरू हो रहे हैं या अपने ज्ञान, साइट या एक्सटेंशन के साथ एप्लीकेशन का विस्तार करने की तलाश में हैं, हमारे पास कई तरह की चीजें हैं जो आप Envato Market में पढ़ सकते हैं।

यदि आपके पास कोई प्रश्न या कमेंट है, तो बस इसे नीचे फ़ीड का उपयोग करके हमे बताएं!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.