Domanda

Con Zend Framework, sto cercando di costruire percorsi per un API REST sulle risorse organizzate nel seguente schema:

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top