Frage

Mit dem Zend Framework, ich versuche Routen für ein REST-API auf Ressourcen in dem folgende Muster organisiert zu erstellen:

Wie richte ich dies mit Zend_Rest_Route?

Hier ist, wie ich Setup die Route für den Benutzer Ressource (Benutzer /: id) in meiner bootstrap.php-Datei:

  $this->bootstrap('frontController');
  $frontController = Zend_Controller_Front::getInstance();
  $restRoute = new Zend_Rest_Route($frontController);
  $frontController->getRouter()->addRoute('default', $restRoute);

[Soweit ich verstehe, ist dies ein catch all Route, so dass Benutzer / 324 / Produkte / 34 würde Ergebnisse in Parametern wie id = 324 und Artikel = 34 und alles würde den Benutzer zugeordnet wird (Frontmodul) Modell . Von dort denke ich, dass ich nur für den Artikel Parameter testen konnte und rufen Sie die Artikel # 34 für Benutzer # 324 auf einer GET-Anfrage] <=== Ich habe es einfach, und es scheint nicht so zu arbeiten.

Acessing / users / 234 / Artikel / 43 und

var_dump($this->_getAllParams());

in der get Wirkung des Rest Controller ergibt folgende Ausgabe:

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

Irgendwie haben beide IDs verloren ...

Wer?

War es hilfreich?

Lösung

AFAIK gibt es keine Funktion in Zend_Rest_Route, die Sie so etwas wie dies zu tun erlaubt. Es gibt einen Vorschlag, aber nicht sicher, wenn es umgesetzt werde. Sie können in Ihrem Bootstrap fügen Sie diese diese individuelle Route einzurichten.

$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 oder item_id in itemAction in Userscontroller als Parameter verfügbar sind:

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

Andere Tipps

Ich öffne die Lösung in Github und als Komponist Paket bezogen. finden Sie unter https://github.com/aporat/Application_Rest_Controller_Route .

Ich habe eine neue Klasse, die Zend_Controller_Router_Route erweitert und fügt abiliy individuellen ruhige Routen hinzuzufügen, wie

$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 bildet den ersten Parameter nach dem Controller-Namen 'id' nur, wenn es 1 Parameter.

Beste Lösung, die ich habe kommen mit ist Zend_Rest_Route Unterklasse und die match () Funktion außer Kraft setzen. Kopieren Zend_Rest_Route die Match-Funktion, sondern fügen Sie die folgenden kurz vor dem „Digest-URI Param“ Kommentar (etwa 60 Zeilen in).

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

Das sollten Sie die Funktionalität die Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top