2013-03-10 10 views
11

मैं एक क्रॉस-प्लेटफ़ॉर्म सिस्टम विकसित कर रहा हूं और मुझे उन्हें एक साथ जोड़ने के लिए एक बाकी API बनाने की आवश्यकता है। मुझे PHP में लंबा अनुभव है और मैं इस सेवा के लिए इसका उपयोग करना चाहता हूं।अच्छा PHP आराम एपीआई लाइब्रेरी

मैं 100% स्वयं एक एपीआई को विकसित कर सकता है, लेकिन मैं आशा करता हूं वहाँ कुछ महान पुस्तकालयों कि मेरे विकास को कम कर सकता है।

क्या किसी को इस तरह के पुस्तकालयों के साथ कोई अनुभव है? आप कुछ भी सिफारिश कर सकते हैं?

+1

यहाँ एक अच्छा लेख है: [Symfony2 साथ बाकी एपीआई: सही रास्ता] (http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2 -थ-दाएं रास्ता /) – j0k

+0

@ j0k: अच्छा, मैं इसे देख लूंगा। शायद समाधान इतना आसान हो सकता है। धन्यवाद। – OptimusCrime

+0

आप कैसे साथ हो रहे हैं? –

उत्तर

11

मैं बैज मिला इस प्रश्न के लिए Popular question, इसलिए मुझे लगता है कि यह समय है कि मैं विस्तार से बताता हूं कि मैंने अपना रीस्ट-सोल्यूटन कैसे किया।

मैंने इस आरईएसटी एपीआई के लिए लैरवेल, सिम्पफोनी 2 और कोडिग्निटर दोनों को देखा। उन सभी के पास कुछ तत्व थे जिन्हें मैंने पसंद किया था और कुछ मुझे नापसंद था। मेरी मुख्य चिंता यह थी कि प्रमाणीकरण कैसे किया जाए क्योंकि मेरे पास एक जटिल एल्गोरिदम था जहां मेरे उपयोगकर्ता Google या Facebook द्वारा प्रदान किए गए ऐप्स 'access_token या access_tokens के साथ लॉग इन कर सकते हैं। मैं अपने ढांचे के पूर्ण नियंत्रण में भी निर्भर करता हूं और ऊपर वर्णित ढांचे में कुछ तत्व थे जो मुझे अनावश्यक और आसपास काम करने में मुश्किल महसूस करते थे। इस वजह से मैंने अपना खुद का आरईएसटी समाधान बनाने का फैसला किया। यह उतना कठिन नहीं है जितना कि कोई उम्मीद कर सकता है, और यह कई तरीकों से किया जा सकता है। जिस तरह से मैंने इसे ओओपी-प्रोग्रामिंग के बारे में कुछ जानकारी की आवश्यकता है।

ओके, इसलिए आरईएसटी नामक बेस-क्लास बनाया गया। यह कक्षा उन सभी चीजों का ख्याल रखती है जो प्रत्येक कॉल के लिए आम हैं। प्रमाणीकरण की तरह, अनुरोधित पथ को विधि में पार्स करना, access_token आदि

इस कक्षा में केंद्रीय चीजों में से एक अनुरोधित पथ है और इसका तरीका किसी विधि में कैसे अनुवादित किया जाता है। मैंने यह लैरावेल से प्रेरित किया था। मेरे पास key =>value है जहां कुंजी यूआरएल है जो मेल खाना चाहिए और मूल्य कॉल करने का वास्तविक तरीका है।

'/user/(:id)' => 'user_id', 

यह मेल खाएंगे किसी भी/उपयोगकर्ता/[संख्या]: मैं भी रास्ता Lavavel तो जैसे URL में चर पार्स शामिल थे। यह भी जांचता है कि यह किस प्रकार का अनुरोध है, इसलिए यदि यह एक आसान तरीका है तो यह get_user_id पर कॉल करने का प्रयास करेगा। (:id) के साथ पार्स किए गए कुछ भी उस विधि को कॉल करते समय तर्क के रूप में उपयोग किए जाएंगे (इसलिए यह वास्तव में get_user_id($id) पर कॉल कर रहा है)।

प्रमाणीकरण के बाद वास्तविक विधि-कॉल का मूल्यांकन किया जाता है। मैं आरईएसटी-क्लास में सभी विधियों (जैसे get_user_id) नहीं चाहता था, इसलिए मैंने इसे विभिन्न नियंत्रकों में तोड़ दिया जो आरईएसटी-क्लास को बढ़ाते हैं। यह अनुरोध किया जा रहा यूआरएल देखकर किया जाता है। यदि यह /user/(:id) है तो स्क्रिप्ट जांच करेगी कि userController.php नामक नियंत्रक है या नहीं। यदि यह मौजूद है, तो जांचें कि जिस विधि को हम कॉल करने जा रहे हैं, वह मौजूद है या नहीं। यदि ऐसा होता है, तो जांच करें कि तर्कों की संख्या हमारे पास क्या है। अगर सबकुछ अच्छा है, तो त्रुटि संदेश वापस न करें, विधि को निष्पादित करें। इस तरह एक एपीआई बनाते समय संरचना और त्रुटि संदेश बहुत महत्वपूर्ण हैं।

विभिन्न नियंत्रकों में मैं प्रमाणीकरण प्राप्त करने के लिए आरईएसटी-कक्षा के लिए कन्स्ट्रक्टर को कॉल करता हूं, यूआरएल का पार्सिंग हल किया जाता है। हर नियंत्रक के तल में

$controller = new MyController(); 
$controller->printResponse(); 

: यहां मुश्किल बात यह है कि मुझे क्या करना नहीं चाहता था है। इसलिए मैंने थोड़ा हैक और एक स्क्रिप्ट बनाई जिसे run.php कहा जाता है जो यह प्रत्येक नियंत्रक-वर्ग के लिए गतिशील रूप से करता है। इससे पहले कि मैं run.php शामिल करता हूं, मैं केवल $path = explode('/',__FILE__); कर नियंत्रक के लिए पथ को सहेजता हूं। इसका उपयोग रन-स्क्रिप्ट में किया जाता है। रन-स्क्रिप्ट इस तरह दिखता है:

// Splitting the file-name, removing the extension 
$name = explode('.',$path[count($path)-1]); 

// Uppercasing the first letter to be nice and OOP-ish 
$classToCall = ucfirst($name[0]); 

// Creating a new instance 
$controller = new $classToCall(); 

// Logging 
$controller->doLog(); 

// Printing the final response 
$controller->printResponse(); 

मुझे यह पता चला कि मैं अपना एपीआई कैसे बनाना चाहता हूं। मैं सरणी में इसे आपूर्ति करके नई विधियों को आसानी से जोड़ सकता हूं जो विधियों के लिए यूआरएल को पार करता है, और मैं अधिकतम स्वच्छता के लिए अच्छी तरह से टूटे हुए अलग नियंत्रकों में नई विधियां जोड़ सकता हूं।

कुछ लोगों को लगता है कि यह बहुत अधिक काम है, लेकिन वास्तव में इसे उठाने और चलाने के लिए मुझे केवल कुछ घंटे लग गए। मैं इसे अत्यधिक गतिशील भी कहूंगा क्योंकि मैं केवल नए नियंत्रकों को जोड़ सकता हूं और सिस्टम उन्हें पहचानेंगे यदि वे वैध यूआरएल-पैटर्न हैं।


कुछ दोस्ताना सलाह।

यदि आप इस समाधान के जैसा कुछ करने का फैसला करते हैं, तो ये कुछ अच्छी युक्तियां हो सकती हैं। प्रत्येक नियंत्रक में, ऐसा कुछ करें:

public function __construct() { 
    // Loading the class-name, setting it in the REST-class, so we can check if it holds the method being called 
    $this->className = get_class($this); 

    // Calling RESTs constructor 
    parent::__construct(); 
} 

हमें उस कक्षा को स्टोर करने की आवश्यकता होगी जिसे हम वर्तमान में काम कर रहे हैं। यह UserController या ऐसा कुछ होगा।

आरईएसटी-कक्षा में मैं इस चर का उपयोग यह जांचने के लिए कर सकता हूं कि इस नियंत्रक में वास्तविक विधि कहां चल रही है या नहीं। मैंने ऐसा किया है:

// Checking if the method exists 
if (method_exists($this->className,$method_name)) { 
    // Check to see if we have the required number of arguments represented 
    $ReflectionClass = new ReflectionClass($this->className); 

    if ($ReflectionClass->getMethod($method_name)->getNumberOfParameters() == count($this->methodUrl['args'])) { 
     $this->response['response'] = call_user_func_array(array($this, $method_name), $this->methodUrl['args']); 

मुझे उम्मीद है कि आप सभी जा सकते हैं।

मुबारक codin '

+0

क्या आप अपना कोड गिटहब में अपलोड कर सकते हैं? क्योंकि PHP में मेरा ज्ञान सीमित है और मेरे ऐप में भी उपयोगकर्ता हैं। –

+0

@ सौरवगची मेरा उत्तर अपडेट किया जाना चाहिए था। यह अब बहुत अप्रचलित है। मैं स्लिम को देखने और माइक्रोस्कोप के रूप में इसका उपयोग करने की सलाह दूंगा।मेरा जवाब PHP प्रोग्रामिंग भाषा के परिचय के रूप में नहीं था। – OptimusCrime

+0

त्वरित उत्तर के लिए धन्यवाद। स्लिम फ्रेमवर्क उपयोगकर्ता प्रबंधन को संभाल सकता है? मुझे सामना करने वाली मुख्य समस्या उपयोगकर्ता प्रबंधन है। Google और फेसबुक एकीकरण के साथ लॉगिन प्रक्रिया और मेरे MySQL डेटाबेस में कुछ डेटा है जो केवल उपयोगकर्ता में लॉग इन कर सकता है। –

0

मेरे पास तीन महीने पहले एक ही प्रश्न था। मैंने उपयोग करने के लिए सबसे अच्छे PHP ढांचे का शोध करने में कई घंटे बिताए। अंत में मैं Laravel पर बस गया।

बॉक्स के बाहर यह सही मार्गों और नियंत्रकों के साथ आता है, और प्रमाणीकरण का उपयोग करने में आसान है। मैं एक साधारण REST API ऊपर था और एक दिन के बारे में में चल

http://laravel.com/docs/routing#the-basics

http://laravel.com/docs/controllers#restful-controllers

यह भी एक महान ORM जो संसाधनों सुपर आसान स्थापित करने में आता है के साथ आता है

http://laravel.com/docs/database/eloquent

मैं संस्करण 3.2 का उपयोग कर रहा हूं और यह एक आकर्षण की तरह काम करता है और स्थिर है। संस्करण 4 अभी भी बीटा में है, लेकिन एक बहुत अधिक बाकी केंद्रित सुविधाओं है (मुझे लगता है कि यह एक आसान अपने नियंत्रकों के भीतर से संसाधन बनाने के लिए) बनाती है

महान ट्यूटोरियल यहाँ http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/

संबंधित मुद्दे