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

कंट्रोलर – कोड इग्नाइटर

कंट्रोलर आपके अनुप्रयोग का हृदय होता है. यही यह सुनिश्चित करता है कि प्रत्येक HTTP अनुरोध का किस प्रकार उपयोग करना है.

कंट्रोलर क्या है?

कंट्रोलर एक क्लास फ़ाइल होती है जिसके नाम को यूआरआई में सम्मिलित किया जा सकता है.

Consider this URI: जरा इस यूआरआई पर ध्यान दें

example.com/index.php/blog/

ऊपर के उदाहरण मे, कोड इग्निटर blog.php को प्राप्त करने के प्रयास करेगा और उसे लोड करेगा.

जब यूआरआई के पहले हिस्से से कंट्रोलर का नाम मिलता है तभी वह लोड होता है.

आइये Hello World! प्रोग्राम बनायें.

आइये एक कंट्रोलर बनायें ताकि आप इसे काम करते देख सकें. अपने टेक्स्ट एडीटर का उपयोग करके एक फ़ाइल बनायें blog.php,और इसमें निम्न लिखित कोड लिखें.

<?php
class Blog extends Controller {
  function index()
  {
    echo 'Hello World!';
  }
} ?>

अब इस फ़ाइल को application/controllers/ फ़ोल्डर में सुरक्षित करें.

अब अपनी साइट में निम्नलिखित यूआरएल को खोलें.

example.com/index.php/blog/

यदि आपने सब कुछ सही किया है तो आपको Hello World!.दिखेगा.

कृपया ध्यान दें: क्लास का नाम हमेशा अंग्रेजी के बड़े(कैपिटल) लेटर से शुरू होना चाहिये. उदाहरण के लिये निम्नलिखित कोड वैध है.

<?php
class Blog extends Controller {
}
?>

निम्नलिखित कोड वैध नही है.

<?php
class blog extends Controller {
}
?>

हमेशा यह सुनिश्चित कर लें कि आपका कंट्रोलर हमेशा parent controller क्लास से extends होना चाहिये ताकि ताकि आपके कंट्रोलर को उसके सारे फ़ंग्शन मिल सकें.

फ़ंग्शन

ऊपर के उदाहरण में फ़ंग्शन का नाम index() है. सामान्यत: जब यूआरआई का दूसरा खंड जब भी खाली होता है तब index() फ़ंग्शन हमेशा लोड होता है. "Hello World" को दिखाने का दूसरा तरीका कुछ ऐसा हो सकता है:

example.com/index.php/blog/index/

यूआरआई का दूसरा खंड कंट्रोलर के उस फ़ंग्शन के बारे में बताता है जिसे अनुरोध भेजा गया है.

आइये आपके कंट्रोलर में एक नया फ़ंग्शन जोड़ें.

<?php class Blog extends Controller { function index() { echo 'Hello World!'; } function comments() { echo 'Look at this!'; } } ?>

अब comment फ़ंग्शन को देखने के लिये निम्नलिखित यूआरआई को ब्राउजर में खोलें.

example.com/index.php/blog/comments/

आप आपना नया संदेश देख पायेंगे

फ़ंग्शन में से यूआरआई के हिस्सों को को गुजारना.

यदि आपका यूआर आई दो से ज्यादा खंड रखता है तो वो खंड आपके फ़ंग्शन मे पैरामीटरों के तौर पर भेजे जा सकते हैं

उदाहरण के लिये, आपके पास कुछ इस तरह का यूआरआई है.

example.com/index.php/products/shoes/sandals/123

आपके फ़ंग्शन(shoes) में यूआरएल के अतिरिक्त हिस्से (3 और 4 यानि "sandals" और "123") भेजे जायेंगे.

<?php
class Products extends Controller {
    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

महत्वपूर्ण:  यदि आप URI Routing का इस्तेमाल कर रहे हैं तो, जो हिस्से आपके फ़ंग्शन से गुजारे जा रहे हैं वो एक बार फ़िर Route होंगे.

डिफ़ाल्ट कंट्रोलर परिभाषित करना

ऐसी स्थिति में जबकि कोई URI  उपस्थित ना हो तब कोड इग्निटर को किसी कंट्रोलर विशेष को लोड करने को कहा जा सकता है. जैसे कि जब आपकी साइट के मुख्य यूआरएल को अनुरोध भेजा जाता है तब किस कंट्रोलर को लोड करना. default controller को परिभाषित करने के लिये application/config/routes.php फ़ाइल को खोलें और उसके वरियेबल को बदल दें. जैसे:

$route['default_controller'] = 'Blog';

यहां Blog उस कंट्रोलर क्लास का नाम है जिसे आप उपयोग करना चाहते हैं. अब यदि आप अपनी मुख्य index.php फ़ाइल को बिना किसी यूआरआई के हिस्से जोड़े लोड करेंगे तो आप Hello World का संदेश देखेंगे.(ऐसा तब ही होगा जब आपने कोई कंट्रोलर Blog के नाम से बनाया हो तथा उसके index फ़ंग्शन में Hello World संदेश को echo कराया हो.)

फ़ंग्शन अनुरोधों को रिमैप करना

जैसा कि ऊपर बताया गया है कि यूआरआई का दूसरा हिस्सा सामान्यत: उस कंट्रोलर के किसी फ़ंग्शन को बताता है. कोड इग्निटर _remap() फ़ंग्शन के द्वारा आपको इस आचरण का उल्लंघन करने की अनुमति प्रदान करता है.

function _remap()
{
    // Some code here...
}

महत्वपूर्ण: यदि आपके कंट्रोलर में _remap() फ़ंग्शन है तो हमेशा इसे ही अनुरोध चला जायेगा चाहे आपके यूआरआई में कुछ भी हो. यह कोड इग्निटर के सामान्य आचरण का उल्लंघन कर देता है और आपको अपने फ़ंग्शन रूटिंग नियम बनाने की अनुमति प्रदान करता है.

निम्न लिखित उदाहरण में उल्लंघित फ़ंग्शन अनुरोध(जो कि सामान्यत: यूआरआई का दूसरा हिस्सा होता है) को _remap() फ़ंग्शन से गुजारा जायेगा.

function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

उत्पाद(आउटपुट) को संसाधित करना

कोड इग्निटर में एक output class है. इसका काम, आपके अंतिम परिणाम को वेब ब्राउजर में अपने आप भेजने का होता है.इसके बारे में अधिक जानकारी Views तथा Output पेजों से प्राप्त कर सकते हैं. कुछ मामलों में आप हो सकता है परिपूर्ण डाटा (जिसे ब्राउजर में भेजा जाना है) को दोबारा संसाधित करना चाहें. कोड इग्निटर आपको _output() नाम के एक फ़ंग्शन को अपने कंट्रोलरों में जोड़ने की अनुमति प्रदान करता है. इस फ़ंग्शन के द्वारा आप परिपूर्ण डाटा को प्राप्त कर पायेंगे.

महत्वपूर्ण: यदि आपके कंट्रोलर में _output() नाम का फ़ंग्शन है तो इसे हमेशा आउटपुट क्लास के द्वारा ही बुलाया जा सकता है. इसका पहला प्राचल या पैरामीटर आपका परिपूर्ण आउटपुट होगा.

यहां एक उदाहरण दिया जा रहा है:

function _output($output)
{
    echo $output;
}

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

निजी या प्राइवेट फ़ंग्शन

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

function _utility()
{
  // some code
}

अगर आप इसे इस तरीके से पाने की कोशिश करेंगे तो यह काम नही करेगा.

example.com/index.php/blog/_utility/

अपने कंट्रोलरों को सब-फ़ोल्डरों में व्यवस्थित करना

यदि आप एक बडा़ अनुप्रयोग बना रहे हैं तो आपको कंट्रोलरों को सब फ़ोल्डरों में व्यवस्थित करना अच्छा लगेगा. कोड इग्निटर में आप ऐसा कर सकते हैं.

आपको बस इतना करना है कि application/controllers डायरेक्ट्री में फ़ोल्डरों को बनाइये और अपनी कंट्रोलर क्लासों को उसमें रख दीजिये.

नोट:  जब आप इस सुविधा का प्रयोग करते हैं तब आपके यू आर आई का पहला हिस्सा फ़ोल्डर का नाम होना चाहिये. उदाहरण के लिये आपका कंट्रोलर यहां है:

application/controllers/products/shoes.php

इस कंट्रोलर को अनुरोध भेजने के लिये आपका यूआरआई कुछ ऐसा लगना चाहिये.

example.com/index.php/products/shoes/show/123

आपके हर सब-फ़ोल्डरो में एक डिफ़ाल्ट कंट्रोलर हो सकता है जिसे तब बुलाया जाये जब यूआरएल में केवल सब फ़ोल्डर हों.इसके लिये आपको application/config/routes.php फ़ाइल में डिफ़ाल्ट कंट्रोलर का नाम बताना होगा.

कोड इग्निटर URI Routing के द्वारा आपको यूआरएल्स को भी रिमैप करने की सुविधा प्रदान करता है.

क्लास कंस्ट्रक्टर(Class Constructors)

यदि आप अपने कंट्रोलरों में कंस्ट्रक्टरों का प्रयोग करना चाहते हैं तो आपको निम्नलिखित लाइन को लिखना होगा.

parent::Controller();

इस लाइन के जरूरी रहने का कारण यह है कि आपके लोकल कंस्ट्रकटर आपके पैरेंट कंट्रोलर की क्लास का उल्लंघन कर सकते हैं अत: हमें उन्हे खुद से बुलाना पड़ता है.

यदि आप कंस्ट्रक्टरों के बारे में नही जानते हैं तो...

पीएचपी ४ में कंस्ट्रकटर एक ऐसा फ़ंग्शन होता है जिसका नाम उसकी क्लास के समान होता है. जैसे:

<?php
class Blog extends Controller {
       function Blog()
       {
parent::Controller();
       }
}
?>

पीएचपी ५ में कंस्ट्रक्टरों के लिये निम्नलिखित वाक्यविन्यास का प्रयोग किया जाता है.

<?php
class Blog extends Controller {
       function __construct()
       {
parent::Controller();
       }
}
?>

यदि आप पहले से ही कुछ वैरियेबलों को सेट करना चाहते हैं या कोई डिफ़ाल्ट क्रिया शुरू करना चाहते हैं तो कंस्ट्रक्टर काफ़ी उपयोगी होते है. कंस्ट्रक्टर कभी कोई मान return नही करते हैं. पर वे कुछ डिफ़ाल्ट कार्य करते हैं.

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

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

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

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

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

ARCHIVES

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

समर्थक