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

Laravel कमांड के लिए आपकी वन-स्टॉप गाइड

by
Difficulty:IntermediateLength:LongLanguages:

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

आज के समय में, डेवलपर्स के लिए यह बहुत ही नॉर्मल है कि उन्हें कंसोल की जानकारी हो, और बेसिक कमांड्स को कैसे बनाएं यह भी पता हो. लेकिन तब क्या हो जब आप अपने खुद के कस्टम कमांड बना सकते हो ताकि आपके वर्कफ्लो को इंप्रूव किया जा सके? अगर हम Laravel 3 की ओर देखते हैं, तो आपको याद आएगा कि यह हमें Tasks ऑफर करता है. Tasks बहुत ही मददगार होते हैं, लेकिन इनमें कार्य करना बहुत ही कठिन होता है. शुक्र है, Laravel 4 Artisan के साथ पैक होकर आता है जिससे की एक डेवलपर के तौर पर आपकी लाइफ आसान होती है.


Artisan क्या होता है?

Artisan एक कमांड लाइन यूटिलिटी है जिसे Laravel 3 के अंदर रिलीज किया गया था.

यदि आपको Laravel की जानकारी नहीं है, तो आपको Artisan के बारे में भी नहीं पता होगा. Artisan एक कमांड लाइन यूटिलिटी है जिसे Laravel 3 के साथ रिलीज किया गया था. यदि आपने अन्य फ्रेमवर्क का प्रयोग किया है, तो आप Artisan को FuewlPHP में Oil की तरह, Zend में ZFTool की तरह या Symfony 2 में Console की तरह मान सकते हैं.

Artisan कई तरह के उपयोगी कमांड्स को देता है जो आपकी मदद करेंगे अलग-अलग प्रकार के टास्क करने में, जैसे कि माइग्रेशन को जनरेट करना या पैकेज के ऐसेट को पब्लिश करना. बिल्ट-इन कमांड के अलावा, आप Artisan को अपनी खुद की कमांड्स के लिए एक्सटेंड कर सकते हैं.


Artisan की फाउंडेशन

यह वह जगह है जहां Artisan अपनी शक्ति को दिखाता है.

Laravel 3 में, Artisan को Taylor Otwell (Laravel का क्रिएटर) द्वारा scratch से लिखा गया था, इस प्रकार यह बहुत ही बेसिक था (फिर भी बहुत बढ़िया). अब जबकि Laravel 4 Composer पर आधारित है, यह अन्य बेहतरीन डेवेलपर्स द्वारा पहले से ही लिखे गए पैकजों का प्रयोग कर सकता है. इसके परिणाम स्वरूप, Laravel 4 अब Symfony फ्रेमवर्क में मौजूद असंख्य पैकजों पर निर्भर है. इन पैकजों में से एक बेहतरीन पैकेज Console Component है.

यदि हम Artisan एप्लीकेशन पर Illuminate\Console\Application में सोर्स पर एक नजर डालें, हम देख सकते हैं की क्लास, खुद ही, Symfony\Component\Console\Application को एक्सटेंड करती है. यह वह जगह है जहां Artisan अपनी शक्ति दिखाता है. हालांकि Artisan Symfony के Console कॉम्पोनेंट का प्रयोग करता है, बहुत से Laravel के इलियास की तरह कॉमन मेथड्स इसमें दिए गए हैं. इसलिए चिंता ना करें, आपको अब भी यही लगेगा कि आप Laravel को ही डेवलप कर रहे हैं!


सामान्य प्रश्न

जब कभी भी हम एक नई कमांड बनाते हैं तो, दो प्रश्न आम तौर पर सामने आते हैं.

Q मुझे कमांड्स को कहां रखना चाहिए?

जब आप Laravel की एक कॉपी को इंस्टॉल करते हैं, तो आप एक पहले से ही डिफाइन की गयी डायरेक्टरी app/commands में देखेंगे. यह डायरेक्टरी डिफ़ॉल्ट रूप से आपके composer.json के classmap में भी होती है. इसका अर्थ है कि, एक बार जब आप कमांड बना लेते हैं, आप को composer dump-autoload को चलाना होगा ताकि एक अपडेट की हुई ऑटो लोड फाइल जनरेट हो सके. यदि आप ऐसा नहीं करते हैं, तो आपको एक एरर प्राप्त होगा, जो यह बताएगा कि आप की कमांड नहीं मिल सकती है.

यदि आप पैकेज बना रहे होते हैं, तो आपको अपने src/<vendor>/<package> पैकेज डायरेक्टरी में कमांड्स को रखने के लिए एक नई डायरेक्टरी बनाने की जरूरत होगी. पूरे Laravel 4 कोड बेस में, इस डायरेक्टरी का नाम होगा Console. यह पक्का करने की यह डायरेक्टरी composer.json पैकेजेस में ऑटोलोड होती है.

Q मुझे कमांड्स को नाम कैसे देना चाहिए?

पूरे Laravel 4 कोड बेस में, सभी कमांड Command के साथ सफिक्स होती हैं, और इसके बाद उस टास्क का नाम होता है जिसे यह करती है. चलिए मानते हैं, उदाहरण के लिए, कि आपके पास एक कमांड है जो आपके कैश को साफ करती हैं. आप इस कमांड को इस प्रकार नाम देंगे, CacheClearCommand.


कमांड के बेसिक

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

Laravel इस boilerplate कोड को आपके लिए जनरेट कर सकता है! सिर्फ इसे चलाएं:

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

कमांड का नाम

सभी कमांड को नाम दिए जाने की आवश्यकता होती है. यह नाम कंसोल में कमांड को चलाए जाते समय प्रयोग किया जाता है, और इसमें उस टास्क को डिस्क्राइब करना चाहिए जो यह कमांड करती है. हालांकि ऐसा कोई भी कन्वेंशन नहीं है कि आप अपनी कमांड को कैसे नाम दें, पर आप निम्न में से किसी एक के बारे में सोच सकते हैं: namespace:group/command, namespace:command, या सिर्फ command.

कमांड की डिस्क्रिप्शन

सभी कमांड्स को डिस्क्रिप्शन दिए जाने की आवश्यकता है. डिस्क्रिप्शन की आवश्यकता तब होती है जब हम Artisan में सभी मौजूद कमांड की लिस्ट को देखते हैं, और जब हम हेल्प डॉक्स को कमांड के लिए देखते हैं. डिस्क्रिप्शन उस टास्क को ब्रीफ में डिस्क्राइब करता हो जो कमांड करती है.

यदि हम अपने कंसोल को खोलने जा रहे हो और मौजूद सभी कमांड की लिस्ट प्राप्त करना चाहे, तो हमें अभी भी अपनी कमांड इस लिस्ट में नजर नहीं आएगी.

हमारी नई कमांड को रजिस्टर करने के लिए, app/start/artisan.php को खोलें और वहां पर मौजूद कमेंट ब्लॉक को जल्दी से पढ़े. जब हम Artisan कमांड को कंसोल में चलाते हैं, यह फाइल शामिल होती है; इसे हम अपनी कमांड को बूटस्ट्रैप करने के लिए प्रयोग करेंगे. इस फाइल में, हमारी पहुंच $artisan वेरिएबल तक होती है जिसे फाइल को शामिल करने से भी पहले डिक्लेअर किया गया. Artisan एप्लीकेशन क्लास याद है जिसे हमने पहले देखा था? वह वाली जो Symfony Console कॉम्पोनेंट को एक्सटेंड करती थी? वेल, $artisan उस क्लास का एक इंस्टेंस है.

आइए अपनी कमांड को जोड़ें ताकि यह कंसोल में उपलब्ध हो.

या, यदि आप स्टैटिक सिंटेक्स को पसंद करते हैं:

add मेथड कमांड के इंस्टेंस को एक्सेप्ट करता है. एक बार जब हमारी कमांड ऐड हो जाती है, हम इसे कंसोल में प्राप्त कर सकते हैं.

कमांड को उपलब्ध कमांड की लिस्ट में भी होना चाहिए, साथ ही साथ हेल्प इंफॉर्मेशन में भी.

यदि आपको कोई एरर मिलता है, तो यह पक्का करें कि आपने composer dump-autoload को अपनी एप्लीकेशन के रूट से चलाया हो, इस कमांड को बनाने के बाद.


रंगो वाला आउटपुट

रंगो वाले टेक्स्ट को कंसोल में आउटपुट करना Artisan का एक प्रभाव है. चार अलग-अलग तरह के हेल्पर मेथड होते हैं जिससे हम ANSI आउटपुट को रंगों के साथ echo कर सकते हैं.


ऑप्शन और अरगुमेंट

Artisan का एक एक्साइटिंग नया फीचर है ऑप्शंस और अरगुमेंट्स के साथ कमांड को उपलब्ध कराने की योग्यता.

आर्ग्यूमेंट्स

अरगुमेंट्स वो स्ट्रिंग होती है जिसे आप कमांड के जरिए भेजते हैं. उन्हें उसी ऑर्डर में कमांड को दिया जाना चाहिए जिनमें वे डिफाइन किये गए है. नीचे दी गई कमांड पर ध्यान दीजिए:

name अरगुमेंट को email अरगुमेंट से पहले दिया जाना चाहिए.

आर्गुमेंट को ऑप्शनल के रूप में डिफाइन किया जा सकता है.

ऑप्शंस

ऑप्शंस हमेशा ऑप्शनल ही होते हैं, और दो डैश के साथ प्रीफिक्स होते हैं, जब उन्हें दिया जाता है.

बुलियन स्विच के रूप में उपयोग किए जाने के अलावा, एक ऑप्शन को वैल्यू या वैल्यू के ऐरे स्वीकार करने के लिए कॉन्फ़िगर किया जा सकता है.

ऑप्शंस और अरगुमेंट्स को डिफाइन करना

इससे पहले कि हम ऑप्शंस और आर्ग्यूमेंट्स को डिफाइन करें, यह बेहतर रहेगा कि हम Symfony की आवश्यक क्लासेस को इंपोर्ट करें (वे लंबी होती है और उन्हें लिखने में हमेशा एक दर्द महसूस होता है). वे दो क्लासेस जिनकी हमें आवश्यकता है Symfony\Component\Console\Input\InputOption और Symfony\Component\Console\Input\InputArgument है.

अपनी क्लास के डिक्लेरेशन से पहले, हम दोनों क्लासेज को इंपोर्ट करेंगे.

ऑप्शंस और आर्ग्यूमेंट्स को डिफाइन करने के लिए, आपको दो नए मेथड बनाने की आवश्यकता होगी: getArguments और getOptions. यह दोनों मेथड आर्ग्यूमेंट्स या ऑप्शंस के ऐरे को रीटर्न करते हैं. चलिए हमारी कमांड को name अरगुमेंट एक्सेप्ट करने वाला बनाएं, और एक age ऑप्शन वाला भी.

याद रखें: Laravel यह सभी boilerplate कोड को आपके लिए जनरेट कर सकता है. हम इसे मैनुअली कर रहे हैं इस उद्देश्य से कि हम क्लास की सभी लाइनों को रिव्यू कर सकें.

अब, हम एक name अरगुमेंट और एक age ऑप्शन को हमारे कंसोल से उपलब्ध करा सकते हैं.

दोनों आर्ग्यूमेंट्स और ऑप्शंस एक मल्टी-डाइमेंशनल ऐरे के रूप में डिफाइन है. आइए इन दोनों की डेफिनेशन पर नजदीक से एक नजर डालते हैं.

अरगुमेंट की डेफिनेशन

अरगुमेंट के लिए ऐरे डेफिनेशन चार keys को एक्सेप्ट करता है, जिनमें से सिर्फ पहली वाली (अरगुमेंट का नाम) रिक्वायर्ड होती है. दूसरी key अरगुमेंट का मोड है और इसे InputArgument::OPTIONAL या InputArgument::REQUIRED होना चाहिए. तीसरी एक डिस्क्रिप्शन है, और चौथी key एक डिफॉल्ट वैल्यू है, यदि मोड InputArgument::OPTIONAL पर सेट है.

यहां एक अरगुमेंट है जो इन सभी ऐरे keys का प्रयोग कर रहा है.

ऑप्शन की डेफिनेशन

ऑप्शन के लिए ऐरे डेफिनेशन पांच keys को एक्सेप्ट करता है जिनमें से सिर्फ पहली (नाम का ऑप्शन) ही रिक्वायर्ड है. दूसरी key ऑक्शन के लिए एक शॉर्टकट है (उदाहरण के लिए -a). तीसरी ऑप्शन का मोड है और दी गई वैल्यूज में से एक हो सकती है: InputOption::VALUE_NONE, InputOption::VALUE_REQUIRED, InputOption::VALUE_OPTIONAL, या InputOption::VALUE_IS_ARRAY. चौथी key ऑप्शंस की डिस्क्रिप्शन है, और पांचवी key एक डिफॉल्ट वैल्यू है, यदि मोड InputOption::VALUE_NONE या InputOption::VALUE_REQUIRED नहीं है.

यहां एक ऑप्शन है, जो सभी ऐरे keys का प्रयोग कर रहा है.

आप साथ ही साथ InputOption::VALUE_IS_ARRAY मोड को InputOption::VALUE_REQUIRED या InputOption::VALUE_OPTIONAL के साथ कंबाइन कर सकते हैं.


कन्फर्मेशन और प्रश्न

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

कंफर्मेशन

confirm का प्रयोग करके, हम यूजर से एक प्रश्न पूछ सकते हैं, और उससे “yes” या “no” कंफर्म करा सकते हैं. आइए कंफर्म करें कि यूज़र ने अपनी उम्र एकदम सही डाली है.

पहला पैरामीटर एक प्रश्न है जो आप पूछना चाहते हैं, और दूसरा एक डिफॉल्ट वैल्यू है, यदि यूजर बिना कुछ लिखे एंटर मारता है.

प्रश्न

ask का प्रयोग करके, हम यूजर से एक प्रश्न पूछ सकते हैं और उससे रिस्पांस की उम्मीद रख सकते हैं. हमारी कमांड को किल करने के बजाय यदि यूज़र यह बताता है की डाली गई उम्र सही नहीं है, तो उससे फिर से डालने के लिए पूछें.


कमांड की डिपेंडेंसीज

डिपेंडेंसी इंजेक्शन यह पता लगाने के लिए कि आपका कोड टेस्ट करने योग्य और फ्यूचर प्रूफ है बहुत महत्वपूर्ण कदम है. आइए अपनी कमांड को एक मॉडल इंस्टेंस को इंजेक्ट करके एक कदम आगे बढ़ाते हैं, ताकि हम यूजर को जनरेट कर सके. हम एक यूजर इंटरफेस और यूजर मॉडल को बनाकर शुरुआत करेंगे.

हमारा UserInterface कोई भी मेथड इंप्लीमेंटेशन को असल में डिफाइन नहीं करता, क्योंकि यह सिर्फ एक उदाहरण है. असली दुनिया की एप्लीकेशन, के लिए आप अपने मॉडल के लिए जिस मेथड की उम्मीद करते हैं उसे बनाएं.

अब जबकि हमारा User मॉडल हमारे UserInterface को इंप्लीमेंट कर रहा है, हम हमारी डिपेंडेंसी को हमारी कमांड में सेटअप करने के लिए बढ़ सकते हैं. मैं हमारी जनरेट कमांड में थोड़ा सा और जोड़ूंगा, और इंजेक्ट किए गए User मॉडल से इंटरेक्ट करूंगा.

पहली चीज जिस पर आपको ध्यान देना चाहिए वह है की कमांड में अब एक कंस्ट्रक्टर है. यह कंस्ट्रक्टर एक सिंगल पैरामीटर एक्सेप्ट करता है और हमने UserInterface को हिंट किया है, तो हम जानते हैं कि क्लास जिसमे हमने मेथड को इंप्लीमेंट किया है इंटरफ़ेस में डिफाइन है. कमांड के कंस्ट्रक्टर को पेरेंट्स के कंस्ट्रक्टर को भी कॉल करना चाहिए.

कमांड के fire मेथड में, हम User मॉडल के इंस्टेंस पर सीधे-सीधे प्रॉपर्टीज को असाइन कर रहे हैं. हम साथ ही साथ loop का भी प्रयोग कर रहे हैं यूजर से लगातार यह पूछने के लिए की क्या उन्होंने अपनी उम्र सही डाली है. अंत में, यूजर को डाटाबेस में सेव कर दिया जाता है और हम कंसोल में आउटपुट देते हैं कि यूजर को जनरेट और सेव कर दिया गया है.

लेकिन रुको! इससे पहले कि हम कमांड का प्रयोग करें, हमें अपने User मॉडल के एक इंस्टेंस को इंजेक्ट करने की जरूरत है.

यदि आपने डेटाबेस को सही ढंग से सेटअप और कॉन्फ़िगर कर लिया है, तो आपको अब कमांड चलाने योग्य होना चाहिए और आपके डेटाबेस में एक नया यूजर होना चाहिए!


पैकेज की कमांड्स

यदि आप Laravel में एक पैकेज बना रहे हैं, तो शायद आप कमांड को इंक्लूड करना चाहे. पैकेज से कमांड को रजिस्टर करना एक इसी प्रकार का प्रोसेस है, सिवाय इसके कि आप app/start/artisan.php मैं कमांड को ऐड नहीं करते (या कर सकते). इसकी बजाय, आप इन्हें अपने पैकेज सर्विस प्रोवाइडर से Artisan के साथ सही करते हैं.

commands मेथड कितने भी अरगुमेंट्स को एक्सेप्ट कर सकता है, और जब Artisan को शुरू किया जाता है तो एप्लीकेशन कंटेनर से कमांड को सही करता है.


सारांश

जब हम Laravel 4 के Artisan की इसके काउंटरपार्ट Laravel 3 से तुलना करते हैं, आपको जल्द ही पता चल जाएगा कि इंप्रूवमेंट बहुत बड़े हैं. कमांड अब IoC कंटेनर से बाउंड किए जा सकते हैं और डिपेंडेंसी इंजेक्शन को इंक्लूड कर सकते हैं, रंगीन ANSI आउटपुट को प्रोवाइड कर सकते हैं, अरगुमेंट्स और ऑप्शंस का प्रयोग कर सकते हैं, और यूज़र इंटरेक्शन की रिक्वेस्ट कर सकते हैं.

Artisan की शक्ति, Symfony के Console कॉम्पोनेंट का धन्यवाद, अविश्वसनीय है. जब हम आगे बढ़ते हैं तो कमांड एक बड़ी भूमिका निभाते हैं -  तो जितनी जल्दी हो सके बोर्ड पर आ जाओ!

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.