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:

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top