Comment mettre en place hiérarchique Zend Rest Routes?
-
18-09-2019 - |
Question
Avec Zend Framework, je suis en train de construire des routes pour un api REST sur les ressources organisées selon le schéma suivant:
- http://example.org/users/
- http://example.org/users/234
- http://example.org/users/234/items
- http://example.org/users/234/items/34
Comment puis-je configurer cela avec Zend_Rest_Route?
Voici comment j'ai installé la route pour la ressource utilisateurs (utilisateurs /: id) dans mon fichier bootstrap.php:
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);
[Pour autant que je comprends, c'est un fourre-tout la route afin que les utilisateurs / 324 / articles / 34 aurait des résultats dans les paramètres définis comme id = 324 et articles = 34 et tout serait mis en correspondance avec les utilisateurs (module avant) Modèle . De là, je suppose que je pouvais tester le paramètre éléments et récupérer l'élément # 34 pour l'utilisateur # 324 sur une requête get] <=== Je viens de vérifier et il ne semble pas fonctionner comme ça:.
acessing / utilisateurs / 234 / articles / 43 et
var_dump($this->_getAllParams());
dans l'action get du contrôleur de repos entraîne la sortie suivante:
array(4) {
["controller"]=> string(5) "users"
["action"]=> string(3) "get"
[2]=> string(5) "items" ["module"]=> string(7) "default"]
}
D'une certaine façon les deux ids se sont perdus ...
Tout le monde?
La solution
AFAIK, il n'y a pas de fonction Zend_Rest_Route qui vous permet de faire quelque chose comme ça. Il y a une proposition, mais ne sais pas quand il sera mis en œuvre. Vous pouvez ajouter dans votre Bootstrap pour mettre en place cet itinéraire personnalisé.
$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 ou item_id seront disponibles en itemAction dans UsersController comme paramètres:
$user_id = $this->_request->getParam('user_id');
Autres conseils
I open source de la solution dans github et comme un paquet du compositeur. voir https://github.com/aporat/Application_Rest_Controller_Route .
J'ai ajouté une nouvelle classe qui étend Zend_Controller_Router_Route et ajoute abiliy pour ajouter des itinéraires personnalisés reposant, comme
$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 le premier paramètre après le nom du contrôleur « id » seulement quand il y a 1 paramètre.
La meilleure solution, je suis venu avec sous-classe est Zend_Rest_Route et remplacer la fonction match (). Copier la fonction de match Zend_Rest_Route, mais ajoutez la ligne suivante juste avant le commentaire « URI Digest Params » (environ 60 lignes).
if($pathElementCount > 1 && $path[0] != 'id') {
$params['id'] = urldecode($path[0]);
array_shift($path);
}
Cela devrait vous donner la fonctionnalité que vous cherchez.