Cómo configurar rutas jerárquica Zend descanso?
-
18-09-2019 - |
Pregunta
Con el Zend Framework, estoy tratando de construir rutas para una API REST de recursos organizados en el siguiente patrón:
- http://example.org/users/
- http://example.org/users/234
- http://example.org/users/234/items
- http://example.org/users/234/items/34
¿Cómo puedo configurar esto con Zend_Rest_Route?
Así es como he fijado la ruta para el recurso a los usuarios (usuarios /: id) en mi archivo Bootstrap.php:
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);
[Por lo que yo entiendo, este es un cajón de sastre ruta para los usuarios / 324 / artículos / 34 causan un conjunto de parámetros como id = 324 y artículos = 34 y todo se asigna a los usuarios (módulo frontal) Modelo . A partir de ahí creo que sólo podría poner a prueba para el parámetro artículos y recuperar el elemento # 34 para el usuario # 324 en una petición GET] <=== acabo de comprobar y que no parece que funciona así:.
acessing / usuarios / 234 / objetos / 43 y
var_dump($this->_getAllParams());
en la acción Get de los resultados de controlador de descanso en la salida siguiente:
array(4) {
["controller"]=> string(5) "users"
["action"]=> string(3) "get"
[2]=> string(5) "items" ["module"]=> string(7) "default"]
}
De alguna manera ambos se perdieron las identificaciones ...
Cualquier persona?
Solución
Que yo sepa, no hay ninguna característica en Zend_Rest_Route que le permite hacer algo como esto. Hay una propuesta, pero no está seguro de cuando va a ser implementado. Puede agregar esto en su Bootstrap para configurar esta ruta personalizada.
$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 estén disponibles en itemAction en UsersController como parámetros:
$user_id = $this->_request->getParam('user_id');
Otros consejos
I de código abierto de la solución en GitHub y como un paquete compositor. ver https://github.com/aporat/Application_Rest_Controller_Route .
He añadido una nueva clase que se extiende Zend_Controller_Router_Route y añade abiliy para añadir rutas a medida de descanso, como
$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 MAPAS El primer parámetro después de que el nombre de controlador a 'id' sólo cuando hay 1 parámetro.
La mejor solución que he llegado con es subclase Zend_Rest_Route y anular la función de concordancia (). Copiar función de concordancia de Zend_Rest_Route, además de añadir los siguientes justo antes del comentario "Digesto URI Parámetros" (alrededor de 60 líneas en).
if($pathElementCount > 1 && $path[0] != 'id') {
$params['id'] = urldecode($path[0]);
array_shift($path);
}
Eso te dará la funcionalidad que está buscando.