CodeIgniter में कस्टम ड्राइवर्स कैसे बनाएं
Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)
CodeIgniter डेवलपर के रूप में कार्य करना, हो सकता है कि आपने लाइब्रेरी के कांसेप्ट को समझा हों जो कोर फ्रेमवर्क फंक्शनलिटी को समृद्ध करता है, और CodeIgniter स्वयं कोर में बहुत उपयोगी लाइब्रेरी प्रदान करता है।
इसी प्रकार, ड्राइवर एक विशेष प्रकार की लाइब्रेरी है जो आपको कस्टम फीचर्स जोड़ने की अनुमति देता है ताकि मुख्य ड्राइवर क्लास पैरेंट क्लास के रूप में कार्य करे और एडाप्टर को चाइल्ड क्लास के रूप में माना जाए।
ड्राइवरों के कांसेप्ट को समझने का सबसे अच्छा तरीका यह है कि कोर CodeIgniter फ्रेमवर्क में कैशिंग को कैसे कार्यान्वित किया जाता है। मुख्य Cache क्लास पैरेंट क्लास के रूप में कार्य करता है और CI_Driver_Library क्लास को एक्सटेंड करता है। दूसरी तरफ, आप APC, Memcached, Redis और इसी जैसे, प्लग करने योग्य एडाप्टर के रूप में इम्प्लीमेंट करने के लिए चाइल्ड क्लासेज खोज लेंगे। चाइल्ड क्लास मुख्य ड्राइवर क्लास की बजाय CI_Driver class को एक्सटेंड करती हैं।
इस एप्रोच की सुंदरता यह है कि आप आवश्यकतानुसार एक नया एडाप्टर जोड़ कर ड्राइवर की फंक्शनलिटी को आसानी से बढ़ा सकते हैं। कैशिंग के मामले में, यदि आपको एक कस्टम कैशिंग स्ट्रेटेजी जोड़ने की आवश्यकता है, तो आप कस्टम एडाप्टर के रूप में इसे अप्लाई करने से केवल एक कदम दूर हैं।
CodeIgniter एप्लिकेशन में एक कस्टम ड्राइवर बनाना आज के लेख का उद्देश्य है। इसके दौरान, हम एक असली दुनिया के उदाहरण के माध्यम से चलेंगे जो एक MediaRenderer ड्राइवर बनाता है जो YouTube, Vimeo और इसी तरह की विभिन्न सेवाओं से मीडिया को प्रस्तुत करने के लिए उपयोग किया जाता है। विभिन्न सेवाओं को एडाप्टर क्लासेज के रूप में अप्लाई किया जाएगा।
फ़ाइल सेटअप
इस आलेख में हम जिस ड्राइवर को अप्लाई करने जा रहे हैं उसका नाम MediaRenderer है। चलो वांछित सेटअप के लिए आवश्यक फ़ाइलों की सूची पर एक त्वरित नज़र डालें:
-
application/libraries/MediaRenderer/MediaRendererInterface.php
: यह इंटरफ़ेस है जिसकी एडाप्टर को इम्प्लीमेंट करने के लिए आवश्यकता है। -
application/config/mediarenderer.php
: कॉन्फ़िगरेशन फ़ाइल जो हमारे कस्टम ड्राइवर से संबंधित सेटिंग्स रखती है। -
application/libraries/MediaRenderer/MediaRenderer.php
: यह वह क्लास है जो CI_Driver_Library को एक्सटेंड करती है और एप्लिकेशन में उपलब्ध विभिन्न एडाप्टर को संचालित करने के लिए उपयोग की जाती है। -
application/libraries/MediaRenderer/drivers/MediaRenderer_youtube.php
: यह वह क्लास है जो YouTube एडाप्टर को इम्प्लीमेंट करती है। -
application/libraries/MediaRenderer/drivers/MediaRenderer_vimeo.php
: यह वह क्लास है जो Vimeo एडाप्टर को इम्प्लीमेंट करती है। -
application/controllers/Media.php
: यह कंट्रोलर क्लास है जिसे हम अपने कस्टम ड्राइवर के उपयोग को प्रदर्शित करने के लिए इम्प्लीमेंट करेंगे।
तो यह उन फाइलों की सूची है जिन्हें हम इस लेख में इम्प्लीमेंट करने जा रहे हैं।
ड्राइवर्स बनाएँ
इस सेक्शन में, हम अपने कस्टम ड्राइवर की मूल फाइलें बनाएंगे।
पहली चीज जो हमें करने की ज़रूरत है वह है हमारे कस्टम ड्राइवर की कॉन्फ़िगरेशन फ़ाइल को परिभाषित करना। आइए नीचे दिखाए गए application/config/mediarenderer.php
फ़ाइल को परिभाषित करें।
1 |
<?php
|
2 |
$config['media_services'] = array('youtube', 'vimeo'); |
3 |
$config['media_default'] = 'youtube'; |
यह इंगित करता है कि हम दो एडेप्टर —YouTube और Vimeo को इम्प्लीमेंट करने जा रहे हैं। डिफ़ॉल्ट एडाप्टर YouTube पर सेट है।
आगे बढ़ें और निम्न कंटेंट के साथ एक फ़ाइल application/libraries/MediaRenderer/MediaRendererInterface.php
बनाएँ।
1 |
<?php
|
2 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
3 |
|
4 |
/**
|
5 |
* MediaRendererInterface
|
6 |
*/
|
7 |
interface MediaRendererInterface |
8 |
{
|
9 |
public function display($id); |
10 |
}
|
जैसा कि आप देख सकते हैं, यह एक सुंदर बुनियादी इंटरफ़ेस है जो सुनिश्चित करता है कि इस इंटरफ़ेस को इम्प्लीमेंट करने वाले एडाप्टर को डिस्प्ले मेथड को इम्प्लीमेंट करना होगा।
इसके बाद, चलिए MediaRenderer
ड्राइवर फ़ाइल को देखें। आगे बढ़ें और निम्न कंटेंट के साथ एक फ़ाइल application/libraries/MediaRenderer/MediaRenderer.php
बनाएँ।
1 |
<?php
|
2 |
if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
3 |
interface_exists('MediaRendererInterface', FALSE) OR require_once(APPPATH.'/libraries/MediaRenderer/MediaRendererInterface.php'); |
4 |
|
5 |
/**
|
6 |
* MediaRenderer Class
|
7 |
*/
|
8 |
class MediaRenderer extends CI_Driver_Library { |
9 |
|
10 |
public $valid_drivers; |
11 |
public $CI; |
12 |
protected $_adapter = 'youtube'; |
13 |
|
14 |
/**
|
15 |
* Class constructor
|
16 |
*/
|
17 |
public function __construct() |
18 |
{
|
19 |
$this->CI =& get_instance(); |
20 |
$this->CI->config->load('mediarenderer'); |
21 |
$this->valid_drivers = $this->CI->config->item('media_services'); |
22 |
$this->_adapter = $this->CI->config->item('media_default'); |
23 |
}
|
24 |
|
25 |
/**
|
26 |
* Overrided __get method to check if the adapter implements MediaRendererInterface interface
|
27 |
* @see CI_Driver_Library::__get()
|
28 |
*/
|
29 |
public function __get($child) |
30 |
{
|
31 |
if (in_array($child, $this->valid_drivers)) |
32 |
{
|
33 |
$object = $this->load_driver($child); |
34 |
|
35 |
if ($object instanceof MediaRendererInterface) |
36 |
{
|
37 |
return $object; |
38 |
}
|
39 |
else
|
40 |
{
|
41 |
show_error("MediaRenderer: Adapter '".$child."' doesn't implement MediaRendererInterface. Aborting."); |
42 |
return; |
43 |
}
|
44 |
}
|
45 |
else
|
46 |
{
|
47 |
show_error('Unable to load the requested adapter: '.$child); |
48 |
return; |
49 |
}
|
50 |
}
|
51 |
|
52 |
/**
|
53 |
* @param string $adapter Adapter name
|
54 |
* @return MediaRenderer
|
55 |
*/
|
56 |
public function setAdapter($adapter) |
57 |
{
|
58 |
$this->_adapter = $adapter; |
59 |
return $this; |
60 |
}
|
61 |
|
62 |
/**
|
63 |
* @param string $id Media ID
|
64 |
*/
|
65 |
public function display($id) |
66 |
{
|
67 |
return $this->{$this->_adapter}->display($id); |
68 |
}
|
69 |
|
70 |
}
|
फ़ाइल की शुरुआत में, हम MediaRendererInterface
इंटरफ़ेस को शामिल करते हैं जिसे हमने पहले ही इस सेक्शन में परिभाषित किया है।
CodeIgniter ड्राइवर स्टैण्डर्ड के अनुसार, हमारी क्लास MediaRenderer
CI_Driver_Library
क्लास को एक्सटेंड करता है जो सुनिश्चित करता है कि हम आसानी से CI_Driver_Library
क्लास में परिभाषित load_driver
मेथड का उपयोग कर ड्राइवर एडाप्टर तक पहुंच सकते हैं।
इसके बाद, चलिए कन्स्ट्रक्टर पर नजदीकी नजर डालें।
1 |
public function __construct() |
2 |
{
|
3 |
$this->CI =& get_instance(); |
4 |
$this->CI->config->load('mediarenderer'); |
5 |
$this->valid_drivers = $this->CI->config->item('media_services'); |
6 |
$this->_adapter = $this->CI->config->item('media_default'); |
7 |
}
|
Mediarenderer कॉन्फ़िगरेशन फ़ाइल को याद करें जिसे हमने पहले परिभाषित किया था और यह वास्तव में पहले स्थान पर कन्स्ट्रक्टर में लोड किया गया है। यह आवश्यक है कि आप एडेप्टर की सूची सेट करें जो ड्राइवर द्वारा valid_drivers
प्रॉपर्टी पर सपोर्टेड है, इसलिए हमने अभी ऐसा किया है। और अंत में, हमने डिफ़ॉल्ट ड्राइवर की वैल्यू हमारी सुविधा के लिए _adapter
प्रॉपर्टी पर सेट कर दिया है।
आगे बढ़ते हुए, चलिए __get
मेथड के कोड को खींचें।
1 |
public function __get($child) |
2 |
{
|
3 |
if (in_array($child, $this->valid_drivers)) |
4 |
{
|
5 |
$object = $this->load_driver($child); |
6 |
|
7 |
if ($object instanceof MediaRendererInterface) |
8 |
{
|
9 |
return $object; |
10 |
}
|
11 |
else
|
12 |
{
|
13 |
show_error("MediaRenderer: Adapter '".$child."' doesn't implement MediaRendererInterface. Aborting."); |
14 |
return; |
15 |
}
|
16 |
}
|
17 |
else
|
18 |
{
|
19 |
show_error('Unable to load the requested adapter: '.$child); |
20 |
return; |
21 |
}
|
22 |
}
|
मैं कहूंगा कि आपको इस मेथड को ओवरराइड करने की आवश्यकता नहीं है, और हमारा ड्राइवर इसके बिना ठीक काम करेगा। हमारे मामले में इस मेथड के इम्प्लीमेंटेशन के पीछे कारण MediaRendererInterface
इंटरफेस के कार्यान्वयन को इम्प्लीमेंट करना है, और इस प्रकार यह सुनिश्चित करेगा कि प्रत्येक ड्राइवर को डिस्प्ले मेथड को इम्प्लीमेंट करना होगा।
इसके बाद, चलिए setAdapter
मेथड को देखें।
1 |
public function setAdapter($adapter) |
2 |
{
|
3 |
$this->_adapter = $adapter; |
4 |
return $this; |
5 |
}
|
जैसा कि आप देख सकते हैं, यदि आप कुछ समय के लिए एक अलग एडाप्टर का उपयोग करना चाहते हैं तो यह डिफ़ॉल्ट एडाप्टर सेटिंग्स को ओवरराइड करने के लिए उपयोग किया जाता है।
अंत में, एक display
मेथड है जो संबंधित एडाप्टर की डिस्प्ले मेथड को कॉल करता है।
1 |
public function display($id) |
2 |
{
|
3 |
return $this->{$this->_adapter}->display($id); |
4 |
}
|
दोबारा, मैं कहूंगा कि आप डिस्प्ले मेथड के इम्प्लीमेंटेशन को छोड़ सकते हैं क्योंकि आप हमेशा एडाप्टर की डिस्प्ले मेथड को कॉल कर सकते हैं, जैसा कि हम बाद में इस आर्टिकल में देखेंगे। हालांकि, मैं MediaRenderer
क्लास की डिस्प्ले मेथड के माध्यम से एडेप्टर तक पहुंच बनाना चाहता हूं क्योंकि यह वह जगह है जहां आप एडाप्टर इम्प्लीमेंट करने वाले सामान्य कोड को दोबारा कर सकते हैं।
तो यह आपके डिस्पोजल में MediaRenderer
क्लास थी।
एडाप्टर बनाएं
हम थोड़ी देर के लिए ड्राइवर एडेप्टर पर चर्चा कर रहे हैं, और अब वास्तव में उन्हें इम्प्लीमेंट करने का समय है।
आइए YouTube एडेप्टर फ़ाइल से application/libraries/MediaRenderer/drivers/MediaRenderer_youtube.php
पर शुरू करें।
1 |
<?php
|
2 |
if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
3 |
|
4 |
/**
|
5 |
* MediaRenderer_youtube Class
|
6 |
*/
|
7 |
class MediaRenderer_youtube extends CI_Driver implements MediaRendererInterface { |
8 |
|
9 |
/**
|
10 |
* @param string $id Media ID
|
11 |
* @see MediaRendererInterface::display()
|
12 |
*/
|
13 |
public function display($id) |
14 |
{
|
15 |
if ($id) |
16 |
{
|
17 |
return '<iframe width="420" height="315" src="//www.youtube.com/embed/'.$id.'" frameborder="0" |
18 |
allowfullscreen></iframe>'; |
19 |
}
|
20 |
}
|
21 |
|
22 |
}
|
यह ध्यान रखना महत्वपूर्ण है कि एडाप्टर नाम MediaRenderer_
के साथ पूर्वनिर्धारित है, और यह CI_Driver
क्लास भी बढ़ाता है। साथ ही, यह सुनिश्चित करने के लिए कि हम पहले माने गए मानकों का पालन करते हैं, हम MediaRendererInterface
इंटरफ़ेस को इम्प्लीमेंट करते हैं।
हमारे एडाप्टर क्लास CI_Driver
क्लास को एक्सटेंड करने का कारण सभी पैरेंट मेथड्स और प्रॉपर्टीज का लाभ उठाना है। आपने इसे सही सुना है, आप MediaRenderer_youtube
क्लास के माध्यम से MediaRenderer
क्लास के मेथड्स और प्रॉपर्टीज तक पहुंच सकते हैं, भले ही यह MediaRenderer
क्लास को सीधे एक्सटेंड न करे।
इसके अलावा, display
मेथड के इम्प्लीमेंटेशन को समझना काफी आसान है, जो एम्बेड कोड देता है बशर्ते कि मीडिया ID मेथड के आर्गुमेंट के रूप में पारित हो।
Vimeo एडाप्टर क्लास YouTube के समान ही है। आगे बढ़ें और application/libraries/MediaRenderer/drivers/MediaRenderer_vimeo.php
पर एक बनाएं।
1 |
<?php
|
2 |
if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
3 |
|
4 |
/**
|
5 |
* MediaRenderer_vimeo Class
|
6 |
*/
|
7 |
class MediaRenderer_vimeo extends CI_Driver implements MediaRendererInterface { |
8 |
|
9 |
/**
|
10 |
* @param string $id Media ID
|
11 |
* @see MediaRendererInterface::display()
|
12 |
*/
|
13 |
public function display($id) |
14 |
{
|
15 |
if ($id) |
16 |
{
|
17 |
return '<iframe width="420" height="247" src="//player.vimeo.com/video/'.$id.'"></iframe>'; |
18 |
}
|
19 |
}
|
20 |
|
21 |
}
|
और यह एडाप्टर की चर्चा समाप्त होता है।
सब कुछ एक साथ करें
पिछले कुछ हिस्सों में, हमने ड्राइवर और एडाप्टर क्लासेज पर चर्चा की है। इस सेक्शन में, जो इस आर्टिकल में आखिरी है, हम बेसिक ड्राइवर उपयोग के प्रदर्शन के माध्यम से जाने के लिए हमारी यात्रा का विस्तार करेंगे।
आइए कंट्रोलर फ़ाइल application/controllers/Media.php
बनाकर शुरू करें।
1 |
<?php
|
2 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
3 |
|
4 |
/**
|
5 |
* Media Controller Class
|
6 |
*/
|
7 |
class Media extends CI_Controller { |
8 |
public function index() |
9 |
{
|
10 |
// this will use default adapter as per the config file
|
11 |
$this->load->driver('mediaRenderer'); |
12 |
|
13 |
// IMP: it must be a lowercase drivername when you use it
|
14 |
echo $this->mediarenderer->display("0GfCP5CWHO0"); |
15 |
|
16 |
// override adapter settings by setting it explicitly
|
17 |
echo $this->mediarenderer->setAdapter('vimeo')->display("225434434"); |
18 |
|
19 |
// access the adapter directly
|
20 |
echo $this->mediarenderer->vimeo->display("225434434"); |
21 |
echo $this->mediarenderer->youtube->display("0GfCP5CWHO0"); |
22 |
}
|
23 |
}
|
पहली चीज जो हमें करने की ज़रूरत है वह है हमारे कस्टम ड्राइवर mediaRenderer
को लोड करना, और यही निम्न स्निपेट करता है।
1 |
$this->load->driver('mediaRenderer'); |
कस्टम ड्राइवर को एक्सेस करने के लिए जिसे हमने अभी लोड किया है, आपको $this->mediarenderer
सिंटेक्स का उपयोग करना चाहिए। यह ध्यान रखना महत्वपूर्ण है कि वास्तविक ड्राइवर नाम के बावजूद, ड्राइवर का नाम लोअरकेस में है।
इसके बाद, आइए देखें कि निम्न कोड क्या करता है।
1 |
echo $this->mediarenderer->display("0GfCP5CWHO0"); |
यह MediaRenderer
क्लास की display
मेथड को पहले स्थान पर कॉल करता है, जिसमें यह mediarenderer कॉन्फ़िगरेशन फ़ाइल में डिफ़ॉल्ट एडाप्टर के रूप में सेट किए गए संबंधित एडाप्टर की display
मेथड पर नियंत्रण को प्रतिनिधि करता है। आखिरकार, यह YouTube एडाप्टर के display
मेथड को कॉल करना समाप्त कर देता है क्योंकि यह हमारे मामले में डिफ़ॉल्ट एडाप्टर है।
दूसरी तरफ, यदि आप किसी भी विशिष्ट एडाप्टर की डिस्प्ले मेथड को कॉल करना चाहते हैं, तो आप हमेशा निम्न स्निपेट में दिखाए गए अनुसार स्पष्ट रूप से ऐसा कर सकते हैं।
1 |
echo $this->mediarenderer->setAdapter('vimeo')->display("225434434"); |
जैसा कि मैंने पहले उल्लेख किया था, आप MediaRenderer
क्लास की डिस्प्ले मेथड के बिना सीधे किसी विशिष्ट एडाप्टर की display
मेथड को भी कॉल कर सकते हैं।
1 |
echo $this->mediarenderer->vimeo->display("225434434"); |
2 |
echo $this->mediarenderer->youtube->display("0GfCP5CWHO0"); |
तो इस तरह आप ड्राइवर और उसके एडेप्टर को साथ-साथ ड्राइवर संरचना के लिए भी कॉल करना चाहते हैं जो आपको आवश्यकतानुसार नए एडाप्टर पर उड़ान भरने की अनुमति देता है।
और बस यही सब है। मुझे उम्मीद है कि आपने लेख का आनंद लिया है, और आप अपने विचारों और चिंताओं को व्यक्त करने के लिए हमेशा कमेंट सेक्शन पर क्लिक कर सकते हैं।
निष्कर्ष
CodeIgniter फ्रेमवर्क में ड्राइवरों के माध्यम से एक यात्रा आज के लेख की रेसिपी थी।
हमेशा की तरह, आर्टिकल CodeIgniter फ्रेमवर्क में ड्राइवरों के कांसेप्ट के मूलभूत परिचय के साथ शुरू हुआ। जैसा कि मैंने वादा किया था, हम वास्तविक दुनिया के उपयोग के मामले के आधार पर एक कस्टम ड्राइवर बनाने के लिए आगे बढ़े, और मुझे विश्वास है कि एक नए कांसेप्ट को समझने का सबसे अच्छा तरीका है।
मुझे यह सुनना अच्छा लगेगा कि क्या आप इस रोमांचक कांसेप्ट के बारे में कुछ लेकर आ सकते हैं!