मंगलवार, 23 फ़रवरी 2010

लाइब्रेरियां बनाना – कोड इग्नाइटर

जब हम "लाइब्रेरी" शब्द का उपयोग करते हैं तो हमारा उससे मतलब उन क्लासों से होता है जो कि libraries फ़ोल्डर के भीतर होती हैं. यहां हम आपको application/libraries डायरेक्ट्री में अपनी लाइब्रेरियां बनाना सिखाएंगे. ऐसा करने से आपके अनुप्रयोग के स्थानीय संसाधन तथा सार्वभौमिक संसाधनों को अलग अलग रखने में मदत मिलती है.

यदि आप पहले से उपलब्ध लाइब्रेरियों में और क्षमतायें जोड़ना चाहते हैं तो कोड इग्नाइटर आपको मूल लाइब्रेरियों को विस्तारित/extend करने की सुविधा देता है. या आप चाहें तो मूल लाइब्रेरियों के नाम वाले संस्करण application/libraries फ़ोल्डर में रखकर मूल लाइब्रेरियों को पूरी तरह से बदल सकते हैं.

संक्षेप में:

  • आप बिल्कुल नई लाइब्रेरियां बना सकते हैं
  • आप पहले से बनी मूल लाइब्रेरियों को विस्तारित कर सकते हैं.
  • आप मूल लाइब्रेरियों को नई लाइब्रेरियों से पूरी तरह बदलकर नई लागू कर सकते हैं.

आगे हम इन तीनों संकल्पनाओं को समझने का प्रयास करेंगे.

कृपया ध्यान दें: आप अपनी क्लासों के द्वारा डाटाबेस क्लासों को ना ही बदल सकते हैं और ना ही विस्तारित कर सकते हैं. इसी प्रकार php4 में लोडर क्लासों को भी विस्तारित या बदला नही जा सकता है. अन्य सभी क्लासों को बदला या विस्तारित किया जा सकता है.

भंडारण

लाइब्रेरी क्लासों को हमेशा application/libraries फ़ोल्डर में रखा जाना चाहिये, क्योंकि कोड इग्नाइटर हमेशा इन्हे वहीं ढूंढ़ने की कोशिश करता है.

नाम लिखने का तरीका

  • फ़ाइलों के नाम का शुरू का अक्षर कैपिटल होना चाहिये. उदाहरण के लिये:  Myclass.php
  • क्लास की घोषणा करते वक्त भी उसके नाम का शुरूआती अक्षर कैपिटल में होना चाहिये. उदाहरण के लिये: class Myclass
  • क्लास का नाम तथा फ़ाइल का नाम मेल खाना चाहिये.

क्लास फ़ाइल

क्लासों को कुछ इस प्रकार दिखाई देना चाहिये (नोट: हम यहां Someclass क्लास के नाम के तौर पर इस्तेमाल कर रहे हैं.)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
    function some_function()
    {
    }
}
?>

अपनी क्लास का उपयोग करना

निम्नलिखित के द्वारा आप अपने किसी भी कंट्रोलर फ़ंग्शन में अपनी क्लास आरंभ कर सकते हैं:

$this->load->library('someclass');

यहां someclass बिना.php एक्सटेंशन के फ़ाइल का नाम है. आप इस फ़ाइल के नाम को बड़े या छोटे अक्षरों में लिख सकते हैं. कोडइग्निटर को इससे फ़र्क नही पड़ता है.

एक बार लोड होने के पश्चात आप अपनी क्लास तक "छोटे अक्षरों(lower case)" के द्वारा भी पहुंच सकते हैं.

$this->someclass->some_function();  // Object instances will always be lower case

क्लास को आरंभ करते वक्त पैरामीटरों को गुजारना

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

$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);

यदि आप इस सुविधा को उपयोग करना चाहते हैं तो आपको क्लास में कंस्ट्रक्टर बनाना होगा.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
    function Someclass($params)
    {
        // Do something with $params
    }
}
?>

आप अपनी config फ़ाइल में सुरक्षित पैरामीटरों को भी गुजार सकते हैं. इसके लिये एक config फ़ाइल बनायें. इसका नाम आपकी क्लास के फ़ाइल के नाम से हूबहू मिलना चाहिये. अब इसे application/config/ फ़ोल्डर में सुरक्षित कर दें. याद रखें कि यदि आप ऊपर वाले तरीके से पैरामीटरों को गुजारेंगे तो, config फ़ाइल का विकल्प उपलब्ध नही होगा.

लाइब्रेरी के भीतर कोड इग्नाइटर के संसाधनों को उपयोग करना

कोड इग्नाइटर के मूल संसाधनों को अपनी लाइब्रेरी के अंदर प्राप्त करने के लिए get_instance() फ़ंग्शन का उपयोग करना होगा. यह फ़ंग्शन कोड इग्नाइटर सुपर आब्जेट देता है.

सामान्यत: अपने कंट्रोलर फ़ंग्शनों से आप किसी किसी उपलब्ध कोड इग्नाइटर फ़ंग्शन को $this कंस्ट्रक्ट के द्वारा पुकारते हैं.

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.

यद्यपि $this सीधे तौर पर केवल आपके कंट्रोलरों, माडलो तथा व्यू में ही काम करता है. यदि आप अपनी क्लासों के भीतर से कोड इग्नाइटर की क्लासों को उपयोग करना चाहत हैं तो आप इसे ऐसे कर सकते हैं:

सर्वप्रथम कोड इग्नाइटर आब्जेक्ट को एक वैरिएबल से निर्दिष्ट कीजिये:

$CI =& get_instance();

एक बार जब आप आब्जेक्ट को वैरिएबल से निर्दिष्ट कर देते हैं, तो आप $this की बजाय उस वैरिएबल के नाम को उपयोग कर सकते हैं.

$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.

कृपया ध्यान दें: आपने ध्यान दिया होगा कि ऊपर का get_instance() फ़ंग्शन को संदर्भ के द्वारा गुजारा जाता है.
$CI =& get_instance();
यह बहुत महत्वपूर्ण है कि किसी संदर्भ के द्वारा निर्दिष्ट करने ने आप कोड इग्नाइटर के वास्तविक आब्जेक्ट्स को उपयोग कर सकते हैं न कि इनकी कापी बनाकर.
यह भी नोट करें: कि यदि आप PHP4 उपयोग कर रहे हैं तो get_instance() को क्लास कंस्ट्रक्टर से पुकारने से बचना ही ठीक रहेगा.

मूल लाइब्रेरियों को अपने संस्करणों से बदलना

यदि आप अपनी क्लास का नाम बिल्कुल कोड इग्नाइटर की मूल लाइब्रेरियों के नाम की तरह रख लेंगे तो कोड इग्नाइटर का तंत्र मूल लाइब्रेरियों की जगह आपकी क्लासों का उपयोग करने लगेगा. इस सुविधा का लाभ लेने के लिये आपको अपनी फ़ाइल का नाम तथा क्लास की घोषणा बिल्कुल मूल लाइब्रेरियों की समान रखनी होंगी. उदाहरण के लिये मूल Email लाइब्रेरी को बदलने के लिये आपको application/libraries/Email.php, फ़ाइल बनानी होंगी और उसमें इस नाम से क्लास की घोषणा करनी होगी:

class CI_Email {
}

ध्यान दीजिये कि ज्यादातर मूल क्लासों में CI_ उपसर्ग के तौर पर लगा होता है.

अपनी लाइब्रेरी को लोड करने के लिये आपको इस फ़ंग्शन का इस्तेमाल करना पड़ेगा:

$this->load->library('email');

कृपया ध्यान दें Note: डाटाबेस क्लासों को अपनी क्लासों से नही बदला जा सकता है.

मूल लाइब्रेरियों को विस्तारित करना

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

  • क्लास की घोषणा अपनी parent class को extend करनी चाहिये.
  • आपकी नई क्लास का नाम तथा फ़ाइल का नाम हमेशा MY_ उपसर्ग के साथ होना चाहिये.(इसे विन्यासित किया जा सकता है. नीचे देखें.)

उदाहरण के लिये, मूल Email क्लास को विस्तारित करने के लिये आपको एक फ़ाइल application/libraries/MY_Email.php बनानी होगी, तथा उसमें इस प्रकार से क्लास की घोषणा करनी होगी:

class MY_Email extends CI_Email {
}

नोट: यदि आपको अपनी क्लास में कंस्ट्रक्टर की जरूरत पड़ती है तो आप उसे parent constructure से extend  जरूर कर लें:

class MY_Email extends CI_Email {
    function My_Email()
    {
        parent::CI_Email();
    }
}

उप-क्लासों/सब-क्लासों को लोड करना Loading Your Sub-class

अपनी उप-क्लासों को लोड करने के लिये आप वही पुराना सिंटेक्स उपयोग करेंगे. हां इस बात का ध्यान रखें कि आप उसमें उपसर्ग ना जोड़ें. उदाहरण के लिए ऊपर दिये गये उदाहरण (जिसमें ईमेल क्लास को विस्तारित किया गया है) को लोड करने के लिये आप निम्नलिखित सिंटेक्स का उपयोग करेंगे:

$this->load->library('email');

एक बार लोड होने के पश्चात आप क्लास वैरिएबलों का प्रयोग बिल्कुल उसी तरीके से करेंगे जैसे कि आप उस क्लास के वैरिएबलों का प्रयोग करते हैं जिसे विस्तारित किया गया है. इस स्थिति में ईमेल क्लास में हर अनुरोध को इस प्रकार लिखा जायेगा:

$this->email->some_function();

अपने स्वयं के उपसर्ग निश्चित करना

अपने स्वयं के उपसर्गों को सेट करने के लिये, अपनी application/config/config.php फ़ाइल खोलिये तथा इस लाइन को खोजिये:

$config['subclass_prefix'] = 'MY_';

कृपया ध्यान दीजिये कि कोड इग्नाइटर की सभी मूल लाइब्रेरियों में CI_ उपसर्ग के तौर पर उपयोग किया जाता है. अत: इसे उपसर्ग के तौर पर प्रयोग ना करें.

कोई टिप्पणी नहीं:

एक टिप्पणी भेजें

इस ब्लाग में प्रकाशित सामग्री कापीराईट द्वारा सुरक्षित है. बिना अनुमति इसका किसी भी प्रकार से अन्यत्र प्रयोग/प्रकाशन मूल रूप में/बदल कर उपयोग नही किया जा सकता है.

हिंदी में तकनीकी लेखन को प्रोत्साहित करें

please donate अभी तक वेब डेवलपमेंट अथवा प्रोग्रामिंग आदि से संबंधित जानकारी पर अंग्रेजी का एकाधिकार रहा है. भारत में इतने आई टी गुरू होने के बावजूद भारतीय भाषाओं में इस विषय पर लेखन नगण्य है. इस ब्लाग के माध्यम से मैं हिन्दी भाषिओं तक वेब डेवलपमेंट का ज्ञान पहुंचाने की कोशिश कर रहा हूं. अत: आप सभी से अनुरोध है कि हिंदी में तकनीकी लेखन के लिये सहयोग करें
मैं वेबसाइटें भी बनाता हूं. यदि आपको बनवानी हो तो बताएं.

ARCHIVES

इस ब्लॉग में खोजें

फ़ॉलोअर