2010-02-05 10 views
9

Zend फ्रेमवर्क के साथ, मैं निम्नलिखित पैटर्न में आयोजित संसाधनों पर एक REST API के लिए मार्गों का निर्माण करने की कोशिश कर रहा हूँ:पदानुक्रमित ज़ेंड आराम मार्ग कैसे सेट करें?

मैं इसे Zend_Rest_Route के साथ कैसे स्थापित करूं?

$this->bootstrap('frontController'); 
    $frontController = Zend_Controller_Front::getInstance(); 
    $restRoute = new Zend_Rest_Route($frontController); 
    $frontController->getRouter()->addRoute('default', $restRoute); 

[जहां तक ​​मैं समझता हूँ, यह एक पकड़ इसलिए सभी मार्ग है: मेरे bootstrap.php फ़ाइल में:

यहाँ कैसे मैं सेटअप उपयोगकर्ताओं संसाधन के लिए मार्ग (आईडी उपयोगकर्ताओं /) है उपयोगकर्ता/324/आइटम/34 आईडी = 324 और आइटम = 34 के रूप में सेट पैरामीटर में परिणाम देगा और सबकुछ उपयोगकर्ताओं (फ्रंट मॉड्यूल) मॉडल में मैप किया जाएगा। वहां से मुझे लगता है कि मैं सिर्फ आइटम पैरामीटर के लिए परीक्षण कर सकता हूं और अनुरोध प्राप्त करने पर उपयोगकर्ता # 324 के लिए आइटम # 34 पुनर्प्राप्त कर सकता हूं।] < === मैंने अभी इसे चेक किया है और ऐसा लगता है कि ऐसा नहीं लगता है:

acessing/उपयोगकर्ताओं/234/आइटम/43 और

var_dump($this->_getAllParams()); 
निम्नलिखित उत्पादन में आराम नियंत्रक परिणामों की कार्रवाई प्राप्त में

:

array(4) { 
["controller"]=> string(5) "users" 
["action"]=> string(3) "get" 
[2]=> string(5) "items" ["module"]=> string(7) "default"] 
} 

किसी तरह दोनों आईडी खो गया ...

कोई भी?

उत्तर

5

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

$user_id = $this->_request->getParam('user_id'); 
+1

जैसे धन्यवाद गयी। आप सही हैं कि मुझे अंततः Zend_Rest_Route को छोड़ना पड़ा क्योंकि वर्तमान कार्यान्वयन ऐसी योजना का समर्थन नहीं करता है। अंततः मैं चेन के साथ Zend_Controller_Router_Route चला गया: http://stackoverflow.com/questions/2250353/how-do-i-write-chains-of-chains-of-of-route-in-a-ini-file-for- the-zend-framew –

3

Zend_Rest_Route 'आईडी' को नियंत्रक नाम के बाद नक्शे पहले पैरामीटर केवल जब वहाँ 1 पैरामीटर:

$front = $this->getResource('FrontController'); 
$testRoute = new Zend_Controller_Router_Route(
    'users/:user_id/items/:item_id', 
    array(
     'controller' => 'users', 
     'action' => 'item', 
     'module' => 'default' 
    ) 
); 

$front->getRouter()->addRoute('test', $testRoute); 

user_id या पैरामीटर के रूप में UsersController में itemAction में उपलब्ध हो ITEM_ID।

सर्वोत्तम समाधान जो मैंने साथ आया है वह Zend_Rest_Route को उपclass और मिलान() फ़ंक्शन को ओवरराइड करना है। Zend_Rest_Route का मिलान फ़ंक्शन कॉपी करें, लेकिन "डाइजेस्ट यूआरआई पैराम्स" टिप्पणी (लगभग 60 लाइनों) से पहले निम्नलिखित जोड़ें।

if($pathElementCount > 1 && $path[0] != 'id') { 
    $params['id'] = urldecode($path[0]); 
    array_shift($path); 
} 

आपको वह कार्यक्षमता देना चाहिए जो आप खोज रहे हैं।

+0

मैंने जो किया है मैंने किया है। लेकिन फिर, आप इसका उपयोग कैसे करते हैं? मैं अपने मार्गों में कुछ ऐसा करने की उम्मीद कर रहा था .it routes.tasktypesstatus.map.1 = "type_id" लेकिन यह काम नहीं करता है:/ – Olivier

+0

हाय, क्या आपने हल किया है? मैं एक ही मुद्दा – user1066183

+0

यह समाधान सही है। एक जादू की तरह काम करता है। Zend_Rest_Route को बढ़ाने के लिए बस अपनी कक्षा बनाने की आवश्यकता है। कन्स्ट्रक्टर और मैच कार्यों को शामिल करना चाहिए। – a2ron44

6

मैंने जिथब में समाधान और एक संगीतकार पैकेज के रूप में समाधान को खोल दिया। https://github.com/aporat/Application_Rest_Controller_Route देखें।

मैं आपके उत्तर के लिए एक नया वर्ग जो Zend_Controller_Router_Route प्रदान करता है और कस्टम शोकहारा मार्गों को जोड़ने के लिए abiliy कहते हैं,

$frontController = Zend_Controller_Front::getInstance(); 
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages'])); 
+0

आपकी कक्षा बस महान काम करती है, धन्यवाद –

+0

धन्यवाद! मजेदार बात यह है कि, मैं शुरुआत में अपने यूआरएल 'उपयोगकर्ता /: user_id/message' के लिए इसका उपयोग करना चाहता था, जो आपके उदाहरण में सटीक यूआरएल था! –

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