2010-02-05 28 views
9

Con el Zend Framework, estoy tratando de construir rutas para una API REST de recursos organizados en el siguiente patrón:Cómo configurar las rutas Hierarchical Zend Rest?

¿Cómo configuro 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, esta es una captura toda la ruta por lo users/324/items/34 daría lugar a parámetros establecidos como id = 324 y items = 34 y todo se correlacionaría con el modelo de usuarios (módulo frontal). A partir de ahí, supongo que podría simplemente probar el parámetro de elementos y recuperar el elemento # 34 para el usuario # 324 en una solicitud de obtención.] < === Acabo de comprobarlo y no parece funcionar así:

acessing/usuarios/234/objetos/43 y

var_dump($this->_getAllParams()); 

en la acción get de los resultados del controlador de descanso en la siguiente salida:

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

de alguna manera los identificadores de ambos se perdían ...

¿Alguien?

Respuesta

5

AFAIK, no hay ninguna función en Zend_Rest_Route que le permita hacer algo como esto. Hay una propuesta pero no estoy seguro de cuándo se implementará. 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: Mapas

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

Gracias por su respuesta. Tienes razón, finalmente tuve que renunciar a Zend_Rest_Route ya que la implementación actual no es compatible con dicho esquema. Finalmente fui el Zend_Controller_Router_Route con cadenas: 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 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 encontrado es la subclase Zend_Rest_Route y anula la función de coincidencia(). Copie la función de coincidencia de Zend_Rest_Route, pero agregue lo siguiente justo antes del comentario "Digest URI Params" (alrededor de 60 líneas).

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

Eso debería darle la funcionalidad que está buscando.

+0

He hecho lo que dices. Pero entonces, ¿cómo lo usas? Esperaba algo como esto en mis routes.init routes.tasktypesstatus.map.1 = "type_id" pero no funciona:/ – Olivier

+0

Hy, ¿lo has resuelto? Soy el mismo problema – user1066183

+0

Esta solución es perfecta. Funciona de maravilla. Solo necesita crear su clase para extender Zend_Rest_Route. Debe incluir el constructor y las funciones de coincidencia. – a2ron44

6

Abro la solución en github y como un paquete de compositor. ver https://github.com/aporat/Application_Rest_Controller_Route.

que añade una nueva clase que se extiende Zend_Controller_Router_Route y añade abiliy 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'])); 
+0

Tu clase funciona genial, gracias –

+0

¡Gracias! Lo gracioso es que inicialmente quise usar esto para mi URL 'users /: user_id/messages', que era la URL exacta en su ejemplo. –

Cuestiones relacionadas