Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)
वेबसाइटें अधिक से अधिक डायनामिक और इंटरैक्टिव बनने के साथ, डेवलपर्स अक्सर वेबसाइटों और वेब ऐप्स को तेजी से बनाने में सहायता के लिए फ़्रेमवर्क्स को देखते हैं। हालांकि कई बहुत अच्छे फ्रेमवर्क उपलब्ध हैं, एक कस्टम फ्रेमवर्क आपको अपनी आवश्यकता अनुसार फ्रेमवर्क को आसानी से कस्टमाइज करने की क्षमता देता है, और इसके साथ निर्माण करना बहुत तेज़ भी है - जैसा की इसमें काम करने से पहले ही इसके ins और outs जानते होंगे। ट्यूटोरियल्स की इस श्रृंखला में, हम अपने स्वयं के PHP5 डेवलपमेंट फ्रेमवर्क का निर्माण करने जा रहे हैं! चलिए अपने फ्रेमवर्क की योजना बनाने के साथ शुरू करते हैं और बेसिक स्ट्रक्चर को सही स्थान में डाल देते हैं।
* नोट - डेमो चलाने से "PCA फ्रेमवर्क वर्जन 0.1 HTML आउटपुट" प्रदर्शित होना चाहिए - जो हमारे फ्रेमवर्क के पहले स्टेज को प्रदर्शित करता है।
स्टेप 1: यह श्रृंखला
इस श्रृंखला में, हम स्क्रैच से अपना स्वयं का PHP5 फ्रेमवर्क तैयार करेंगे। फ्रेमवर्क में बेसिक कंटेंट मैनेजमेंट फीचर्स शामिल होंगे, और हम इसका उपयोग छोटे संगठन के लिए वेब पर आधारित डायरेक्टरी बनाने के लिए करेंगे।
उम्मीद है कि, जैसे जैसे हम आगे बढ़ते हैं, आप अपनी आवश्यकताओं को बेहतर तरीके से सूट करने के लिए इस फ्रेमवर्क को बेहतर बनाएंगे, बिल्ड अप करेंगे और ऑप्टिमाइज़ करने के लिए बेहतर करेंगे, हालांकि इन ट्यूटोरियल्स में हम एक सरल फ्रेमवर्क तैयार करना और वेबसाइट चलाने और संचालित करना चाहते हैं।



अगले कुछ हफ्तों में, इन ट्यूटोरियल के दौरान हम कवर करेंगे:
- ऑथेंटिकेशन हैंडलर, डेटाबेस अब्स्ट्रक्शन लेयर और टेम्पलेट मैनेजर बनाना
- इन ऑब्जेक्ट्स को एक साथ लाओ
- कंटेंट को मैनेज करने के लिए फ्रेमवर्क का उपयोग करना, और हमारी साइट को पावर करना
- एक शानदार फ्रंट एंड डिजाइन बनाना।
- स्टोरीबोर्डिंग द्वारा लॉगिन प्रक्रिया के लिए डिजाइनिंग
- फ्रेमवर्क कैसे एक्सटेंड किया जा सकता है और एक्सपैंड किया जा सकता है
स्टेप 2: डिजाइन पैटर्न और हमारे फ्रेमवर्क के भीतर उनका उपयोग
किसी भी बड़े कंप्यूटर-आधारित सिस्टम को बनाते समय, यह एक डेस्कटॉप एप्लिकेशन, एक वितरित नेटवर्क सिस्टम, या एक वेब एप्लीकेशन हो, इसके इम्प्लीमेंटेशन से जुड़े आर्किटेक्चरल चुनौतियां हमेशा रहेंगी।
डिजाइन पैटर्न इन सामान्य समस्याओं में से कुछ को संबोधित करते हैं, और हम कई फ्रेम पैटर्न का उपयोग करेंगे क्योंकि हम अपना फ्रेमवर्क बनाते हैं, यह सुनिश्चित करने के लिए कि हमारे पास क्वालिटी, फ्लेक्सिबल, मजबूत और उपयोग करने योग्य फ्रेमवर्क है, किसी भी उद्देश्य के लिए उपयुक्त है! विशेष रूप से, इस ट्यूटोरियल में हम सिंगलटन पैटर्न और रजिस्ट्री पैटर्न को देखने जा रहे हैं।
स्टेप 3: फ़ाइलें और फ़ोल्डर
हमारा फ्रेमवर्क बनाना शुरू करने वाली पहली चीज़, एक उपयुक्त फ़ाइल स्ट्रक्चर बनाना है, जैसे कि सबकुछ अपनी जगह है। साथ ही फ्रेमवर्क को सशक्त करने वाली फाइलें, हमें उस वेबसाइट से संबंधित फाइलों के प्रोविशन भी करने की आवश्यकता है, जिसे हम अपने फ्रेमवर्क के साथ बनाने जा रहे हैं। अधिकांश वेबसाइटों और वेब एप्लीकेशन में:
- कुछ सामान्य रूप से इस्तेमाल किए गए फंक्शन्स / ऑब्जेक्ट्स।
- बिज़नेस लॉजिक।
- एक डिजाईन
यह हमें एक बहुत अच्छा प्रारंभिक बिंदु देता है, उन तीन केटेगरी में से प्रत्येक से संबंधित फाइलों को अपने स्वयं के सेक्शन में एक साथ ग्रुप किया जाना चाहिए। नीचे डायरेक्टरी स्ट्रक्चर पर नज़र डालें, फिर हम स्ट्रक्चर के कारणों पर चर्चा करेंगे।

ध्यान दें कि .settings फ़ोल्डर और .project फ़ाइल IDE द्वारा उपयोग की गई थी, और इसे आपके एप्लीकेशन में उपस्थित होने की आवश्यकता नहीं है
कोर फ़ंक्शन और ऑब्जेक्ट्स, जैसे डेटाबेस एक्सेस, ऑथेंटिकेशन, टेम्पलेट हैंडलिंग, ईमेल भेजने वाले ऑब्जेक्ट्स, ईमेल पार्सिंग ऑब्जेक्ट्स, PCARegistry फ़ोल्डर के भीतर ऑब्जेक्ट्स नामक फ़ोल्डर में स्टोर किए जाने चाहिए। यह हमें रजिस्ट्री के भीतर स्टोर ऑब्जेक्ट्स से रजिस्ट्री से लॉजिक को अलग करने की अनुमति देता है (जिसे हम जल्द ही देखेंगे)।
इसके बाद, हमें कहीं अपना बिज़नेस लॉजिक को स्टोर करना चाहिए, जो वो फाइलें होंगी जो हम बनाएंगे जो हमारे फ्रेमवर्क का उपयोग करती हैं। हमें इन फ़ाइलों को controllers नामक फ़ोल्डर में रखना चाहिए। प्रत्येक प्रमुख फ़ंक्शन जो हमारी वेबसाइट या वेब एप्लिकेशन करता है (उदाहरण. बिज़नेस डायरेक्टरी लिस्ट, कंटेंट प्रदान करने और मैनेज करने, इमेज गैलरी प्रदान करने आदि) एक अलग कंट्रोलर होगा, जो controllers फ़ोल्डर के भीतर अपने फ़ोल्डर में स्टोर होगा। हम इन ट्यूटोरियल में इनका उपयोग नहीं करेंगे, लेकिन हमारी डायरेक्टरी स्ट्रक्चर को जगह में रखना महत्वपूर्ण है, इसलिए हम जानते हैं कि यह कैसे काम करेगा।
साइट डिज़ाइन और टेम्पलेट्स को skins फ़ोल्डर में स्टोर किया जाना चाहिए। चूंकि हम अलग-अलग डिज़ाइन चाहते हैं (या तो हमारे फ्रेमवर्क के साथ बनाए गए एप्लीकेशन/वेबसाइट के यूज़र्स कई डिज़ाइनों से चुन सकते हैं, या सीजन या विशेष इवेंट के आधार पर डिज़ाइन को बदल सकते हैं), प्रत्येक स्किन को अपने फ़ोल्डर में कॉन्टैन किया जाएगा।
स्टेप 4: रजिस्ट्री
हमारे फ्रेमवर्क के केंद्र में हमारे पास कोर फंक्शन्स होंगे, जैसे डेटाबेस एक्सेस, यूजर ऑथेंटिकेशन इत्यादि। रजिस्ट्री डिज़ाइन पैटर्न को इम्प्लीमेंट करके, हम रजिस्ट्री के भीतर इन ऑब्जेक्ट्स को केंद्रीय रूप से स्टोर कर सकते हैं, रजिस्ट्री के अंदर, हमारे फ्रेमवर्क और किसी भी एप्लीकेशन के लिए आसान बनाता है जो हमारे फ्रेमवर्क का प्रयोग एक्सेस करने के लिए करती है।
रजिस्ट्री डिज़ाइन पैटर्न ऑब्जेक्ट्स के रेफरेन्सेस को स्टोर करता है और रिट्रीव करता है, और एक टेलीफोन डायरेक्टरी के समान काम करता है: कॉन्टेक्ट्स को स्टोर करना और रिट्रीव करना। हम इन कोर ऑब्जेक्ट्स, सिस्टम-वाइड सेटिंग्स, और बाद में, किसी अन्य डेटा या जानकारी को स्टोर करने के लिए इसका उपयोग करेंगे, जिसे सिस्टम में शेयर करने की आवश्यकता है।
चूंकि हम इस जानकारी को केंद्रीय रूप से स्टोर कर रहे हैं, हम केवल एक रजिस्ट्री ऑब्जेक्ट को हमारे फ्रेमवर्क के भीतर उपलब्ध कराना चाहते हैं, यदि एक से अधिक उपलब्ध हो, तो हमें ऐसी समस्याएं होंगी जहां हम डेटा के एक निश्चित पीस की उम्मीद कर रहे हो, या एक रजिस्ट्री में होने के लिए निश्चित ऑब्जेक्ट, जब इसे वास्तव में Registry ऑब्जेक्ट के किसी अन्य इंस्टैंस में स्टोर किया गया हो। इस समस्या को हल करने के लिए, हमारी Registry ऑब्जेक्ट भी सिंगलटन डिज़ाइन पैटर्न को इम्प्लीमेंट करेगा, जो उपलब्ध होने के लिए ऑब्जेक्ट के एक से अधिक इंस्टैंस को रोकता है।
नीचे registry.class.php फ़ाइल के लिए PHP कोड है, हम जल्द ही देखेंगे कि यह कैसे काम करता है।
<?php /** * The PCARegistry object * Implements the Registry and Singleton design patterns * * @version 0.1 * @author Michael Peacock */ class PCARegistry { /** * Our array of objects * @access private */ private static $objects = array(); /** * Our array of settings * @access private */ private static $settings = array(); /** * The frameworks human readable name * @access private */ private static $frameworkName = 'PCA Framework version 0.1'; /** * The instance of the registry * @access private */ private static $instance; /** * Private constructor to prevent it being created directly * @access private */ private function __construct() { } /** * singleton method used to access the object * @access public * @return */ public static function singleton() { if( !isset( self::$instance ) ) { $obj = __CLASS__; self::$instance = new $obj; } return self::$instance; } /** * prevent cloning of the object: issues an E_USER_ERROR if this is attempted */ public function __clone() { trigger_error( 'Cloning the registry is not permitted', E_USER_ERROR ); } /** * Stores an object in the registry * @param String $object the name of the object * @param String $key the key for the array * @return void */ public function storeObject( $object, $key ) { require_once('objects/' . $object . '.class.php'); self::$objects[ $key ] = new $object( self::$instance ); } /** * Gets an object from the registry * @param String $key the array key * @return object */ public function getObject( $key ) { if( is_object ( self::$objects[ $key ] ) ) { return self::$objects[ $key ]; } } /** * Stores settings in the registry * @param String $data * @param String $key the key for the array * @return void */ public function storeSetting( $data, $key ) { self::$settings[ $key ] = $data; } /** * Gets a setting from the registry * @param String $key the key in the array * @return void */ public function getSetting( $key ) { return self::$settings[ $key ]; } /** * Gets the frameworks name * @return String */ public function getFrameworkName() { return self::$frameworkName; } } ?>
तो, Registry ऑब्जेक्ट कैसे काम करता है, और यह हमारे ऑब्जेक्ट्स को अच्छी तरह से कैसे स्टोर करता है?
- ऑब्जेक्ट्स को एक array के भीतर स्टोर किया जाता है।
- जब Registry के भीतर कोई नया ऑब्जेक्ट स्टोर किया जाता है, तो क्लास फ़ाइल इंक्लूड की जाती है, ऑब्जेक्ट प्रारम्भ होता है और फिर इसे array में स्टोर किया जाता है।
- ऑब्जेक्ट्स getObject मेथड को ऑब्जेक्ट्स "key" पास करके रिट्रीव किए जाते हैं।
यह रजिस्ट्री ऑब्जेक्ट की दूसरी कॉपी को कैसे रोकता है?
- कन्स्ट्रक्टर private है, ऑब्जेक्ट को सीधे बनाए जाने से रोकता है।
- ऑब्जेक्ट क्लोनिंग एक एरर ट्रिगर करता है।
- अगर हमें ऑब्जेक्ट को हमारे फ्रेमवर्क के भीतर से एक्सेस करने की आवश्यकता है, और यह उस फ़ाइल के लिए सीधे उपलब्ध नहीं है जिसमें हम काम कर रहे हैं, हम रजिस्ट्री का इंस्टैंस प्राप्त करने के लिए स्थैतिक मेथड सिंगलटन (PCARegistry::singleton()) को कॉल कर सकते हैं।
स्टेप 5: index.php
कोर फंक्शनलिटी के लिए तैयार स्ट्रक्चर के साथ जो हम एक और ट्यूटोरियल में जोड़ देंगे, आइए देखते हैं कि हम रजिस्ट्री तक कैसे पहुंचेंगे, और हमारे फ्रेमवर्क सिंगल पॉइंट एक्सेस, हमारी index.php फ़ाइल पर काम शुरू करें।
दोस्ताना URLs आमतौर पर डायनामिक वेबसाइटों और वेब ऍप्लिकेशन्स के सभी रूपों में उपलब्ध होते हैं, और ऐसा करने के सबसे सरल तरीकों में से एक (और हमारे फ्रेमवर्क के माध्यम से जानकारी के नियंत्रण को मैनेज करने के लिए) यह सुनिश्चित करना है कि हमारे सभी पेज रिक्वेस्ट index.php फाइल के माध्यम से जाएं। बाद के ट्यूटोरियल में, हम एक .htaccess फ़ाइल को एक अच्छे, फ्रेंडली फॉर्मेट से रिक्वेस्ट को रीडायरेक्ट करने के लिए एक फॉर्मेट में बनाएंगे जो हमारी index.php फ़ाइल समझ सके।
Index.php फ़ाइल का कोड नीचे है। यह इस समय बहुत अधिक नहीं करता है, लेकिन यह हमें चीजों को जगह में लाने की इजाजत देता है।
<?php /** * PCAFramework * Framework loader - acts as a single point of access to the Framework * * @version 0.1 * @author Michael Peacock */ // first and foremost, start our sessions session_start(); // setup some definitions // The applications root path, so we can easily get this path from files located in other folders define( "APP_PATH", dirname( __FILE__ ) ."/" ); // We will use this to ensure scripts are not called from outside of the framework define( "PCAFW", true ); /** * Magic autoload function * used to include the appropriate -controller- files when they are needed * @param String the name of the class */ function __autoload( $class_name ) { require_once('controllers/' . $class_name . '/' . $class_name . '.php' ); } // require our registry require_once('PCARegistry/pcaregistry.class.php'); $registry = PCARegistry::singleton(); // print out the frameworks name - just to check everything is working print $registry->getFrameworkName(); exit(); ?>
तो... इस समय हमारी index.php फ़ाइल क्या करती है? यह:
- यह सुनिश्चित करने के लिए कि हम पूरे फ्रेमवर्क में सेशन का उपयोग कर सकें, start_session को तुरंत कॉल करें। (इसे किसी आउटपुट से पहले कॉल किया जाना चाहिए।
- यह वर्तमान फ़ाइल पाथ की डेफिनिशन बनाता है, इसलिए हम फ्रेमवर्क रूट डायरेक्टरी को कहीं और से रिफरेन्स कर सकते हैं, और यह एक डेफिनिशन बनाता है जिसे हम यह सुनिश्चित करने के लिए उपयोग करेंगे कि सभी फ्रेमवर्क की सभी फ़ाइलों को फ्रेमवर्क से ही बुलाया जा सके, और कोई भी फ़ाइलों में से किसी एक को सीधे कॉल करने की कोशिश नहीं कर रहा है
- यह निर्धारित करने के लिए ऑटोलोड लोड फ़ंक्शन का उपयोग करता है कि कोई भी क्लास कहां स्थित हो सकती है। इस मामले में, यह controllers डायरेक्टरी को इंगित करता है, क्योंकि यह वह जगह है जहां हमारे बिज़नेस लॉजिक संग्रहीत किए जाएंगे।
- इसमें रजिस्ट्री क्लास शामिल है (यह आवश्यक है क्योंकि क्लास कंट्रोलर फ़ोल्डर में नहीं है जहां ऑटोलोड लोड इसे मिलेगा, और रजिस्ट्री के इंस्टैंस को वेरिएबल $registry से रिफरेन्स करता है।
- अंत में, यह रजिस्ट्री के भीतर से एक साधारण फंक्शन का प्रदर्शन करने के लिए, फ्रेमवर्क के नाम को प्रिंट करता है।
हम अधिक विस्तार से देख सकते हैं कि रजिस्ट्री हमारे फ्रेमवर्क के भीतर कैसे काम करेगी - इसका उपयोग करने के लिए कुछ डमी क्लास फाइलें बनाकर। PCARegsitry/objects फ़ोल्डर में एक नई template.class.php फ़ाइल में टेम्पलेट क्लास के साथ, हम इसे index.php फ़ाइल में कुछ अतिरिक्त कोड जोड़कर इसे प्रदर्शित कर सकते हैं।
पहली बार $registry का रिफरेन्स देने के बाद लाइन पर, हम जोड़ सकते हैं:
$registry->storeObject('template','template');
यदि हमारे टेम्पलेट क्लास में इसमें कोई मेथड था, जैसे generateOutput, हम इस मेथड को index.php से कॉल कर सकते हैं जैसे:
$registry->getObject('template')->generateOutput();
हमारे फ्रेमवर्क में अब इसकी बेसिक स्ट्रक्चर है, और हमारे पास हमारे मुख्य फंक्शनलिटी के लिए एक रजिस्ट्री है, अगले ट्यूटोरियल में, हम उन ऑब्जेक्ट्स को बनाना देखेंगे जो हमारी रजिस्ट्री स्टोर करेंगे, बेसिक डेटाबेस अब्स्ट्रक्शन लेयर और सिक्योरिटी मैनेजर से शुरुआत होगी।
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly