Come impostare percorsi gerarchici Zend riposo?
-
18-09-2019 - |
Domanda
Con Zend Framework, sto cercando di costruire percorsi per un API REST sulle risorse organizzate nel seguente schema:
- http://example.org/users/
- http://example.org/users/234
- http://example.org/users/234/items
- http://example.org/users/234/items/34
Come faccio a impostare questo 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, questa è una cattura tutto percorso in modo utenti / 324 / oggetti / 34 sarebbero risultati in parametri impostati come id = 324 e gli elementi = 34 e tutto sarebbe stato mappato agli Utenti (modulo anteriore) Modello . Da lì Credo che avrei potuto solo provare per il parametro oggetti 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 controllore riposo nella seguente output:
array(4) {
["controller"]=> string(5) "users"
["action"]=> string(3) "get"
[2]=> string(5) "items" ["module"]=> string(7) "default"]
}
In qualche modo sia IDS si è persa ...
Chiunque?
Soluzione
Per quanto ne sappia, non v'è alcuna funzione in Zend_Rest_Route, che ti permette di fare qualcosa di simile. C'è una proposta, ma non so quando sarà attuato. È possibile aggiungere questo nella vostra Bootstrap per impostare 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);
user_id o item_id diventa disponibile in itemAction in UsersController come parametri:
$user_id = $this->_request->getParam('user_id');
Altri suggerimenti
I open source la soluzione in github e come un pacchetto di compositore. vedi https://github.com/aporat/Application_Rest_Controller_Route .
Ho aggiunto una nuova classe che si estende Zend_Controller_Router_Route e aggiunge abiliy per 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']));
Zend_Rest_Route mappe il primo parametro dopo il nome del controller di 'id' solo quando v'è 1 parametro.
soluzione migliore mi è venuta in mente è quello di sottoclasse Zend_Rest_Route e sovrascrivere la funzione match (). Copiare funzione match di Zend_Rest_Route, ma aggiungere le seguenti appena prima il commento "Digest URI Parametri" (circa 60 righe in).
if($pathElementCount > 1 && $path[0] != 'id') {
$params['id'] = urldecode($path[0]);
array_shift($path);
}
Che dovrebbe darvi la funzionalità che stai cercando.