2010-02-05 9 views
9

Con Zend Framework, sto cercando di costruire percorsi per un API REST sulle risorse organizzate nel seguente schema:Come impostare Hierarchical Rest Route Rest?

Come faccio a configurarlo con Zend_Rest_Route?

Ecco come ho installato il percorso per la risorsa utenti (utenti /: id) nel mio file bootstrap.php:

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

[Per quanto ho capito, questo è un fermo tutto percorso in modo users/324/items/34 risulterebbero in parametri impostati come id = 324 e items = 34 e tutto sarebbe mappato al modello Users (front module). Da lì immagino di poter testare il parametro item e recuperare l'elemento # 34 per l'utente # 324 su una richiesta get.] < === Ho appena controllato e non sembra funzionare così:

acessing/utenti/234/items/43 e

var_dump($this->_getAllParams()); 

nell'azione ottenere dei risultati del controller resto nel seguente output:

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

in qualche modo entrambi i ids siamo persi ...

Chiunque?

risposta

5

AFAIK, non c'è nessuna funzione in Zend_Rest_Route che ti permetta di fare qualcosa del genere. C'è una proposta ma non è sicuro quando verrà implementata. Puoi aggiungere questo nel tuo Bootstrap per configurare questo percorso personalizzato.

$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); 

id_utente o item_id diventano disponibili in itemAction in UsersController come parametri: mappe

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

Grazie per la risposta. Hai ragione, alla fine ho dovuto rinunciare a Zend_Rest_Route in quanto l'attuale implementazione non supporta tale schema. Alla fine sono andato su Zend_Controller_Router_Route con Chains: 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 il primo parametro dopo il nome del controller di 'id' solo quando v'è 1 parametro.

La soluzione migliore che mi è venuta in mente è la sottoclasse di Zend_Rest_Route e l'override della funzione match(). Copia la funzione di corrispondenza di Zend_Rest_Route, ma aggiungi quanto segue appena prima del commento "Digest URI Params" (circa 60 righe in).

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

Questo dovrebbe darvi la funzionalità che state cercando.

+0

Ho fatto quello che dici. Ma poi, come lo usi? Mi aspettavo qualcosa di simile nel mio routes.init routes.tasktypesstatus.map.1 = "type_id" ma non funziona:/ – Olivier

+0

Hy, hai risolto? Sono lo stesso numero – user1066183

+0

Questa soluzione è perfetta. Funziona come un fascino. Devi solo creare la tua classe per estendere Zend_Rest_Route. Dovrebbe includere le funzioni di costruzione e corrispondenza. – a2ron44

6

Ho aperto la soluzione in github e come pacchetto di composizione. vedi https://github.com/aporat/Application_Rest_Controller_Route.

ho aggiunto una nuova classe che si estende Zend_Controller_Router_Route e aggiunge abiliy aggiungere percorsi rilassanti personalizzati, come ad esempio

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

La tua classe funziona alla grande, grazie –

+0

Grazie! La cosa divertente è che inizialmente volevo usare questo per il mio URL 'users /: user_id/messages', che era l'esatto URL nel tuo esempio! –