2010-02-05 5 views
9

Mit dem Zend Framework, ich versuche Routen für ein REST-API auf Ressourcen in dem folgende Muster organisiert zu bauen:Wie werden hierarchische Zend-Rest-Routen eingerichtet?

Wie richte ich das mit Zend_Rest_Route ein?

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 alle fangen Route so users/324/items/34 würde zu Parametern führen, die als id = 324 und items = 34 gesetzt werden und alles dem Benutzermodell (Frontmodul) zugeordnet würde. Von dort denke ich, dass ich gerade nach dem Einzelteilparameter prüfen und das Einzelteil Nr. 34 für Benutzer # 324 auf einer Ersuchenanforderung zurückholen könnte. < === Ich überprüfte es gerade und es scheint nicht so zu arbeiten:

Acessing/users/234/Produkte/43 und

var_dump($this->_getAllParams()); 

in der get Wirkung der Rest Controller ergibt die folgende Ausgabe:

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

Irgendwie beide ids verloren gegangen ...

Jeder?

Antwort

5

AFAIK, es gibt keine Funktion in Zend_Rest_Route, mit der man so etwas machen kann. Es gibt einen Vorschlag, aber nicht sicher, wann es implementiert wird. Sie können dies in Ihrem Bootstrap hinzufügen, um diese benutzerdefinierte 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 zur Verfügung stehen:

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

Vielen Dank für Ihre Antwort. Du hast recht, ich musste schließlich Zend_Rest_Route aufgeben, da die aktuelle Implementierung ein solches Schema nicht unterstützt. Ich ging schließlich die Zend_Controller_Router_Route mit Ketten: http://stackoverflow.com/questions/2250353/how-do-i-write-chains-of-route-in-a-in-i-file-for-in- the-zend-framew –

3

Zend_Rest_Route bildet den ersten Parameter nach dem Controller-Namen 'id' nur, wenn es ein Parameter ist.

Die beste Lösung, die ich mir ausgedacht habe, ist, Zend_Rest_Route abzuleiten und die Funktion match() zu überschreiben. Kopiere die Match-Funktion von Zend_Rest_Route, füge aber kurz vor dem Kommentar "Digest URI Params" (ca. 60 Zeilen) folgendes hinzu:

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

Das sollte Ihnen die Funktionalität geben, die Sie suchen.

+0

Ich habe getan was du sagst. Aber dann, wie benutzt du es? Ich habe so etwas in meinen routes erwartet.init routes.tasktypesstatus.map.1 = "type_id" aber es funktioniert nicht:/ – Olivier

+0

Hy, hast du gelöst? Ich bin das gleiche Problem – user1066183

+0

Diese Lösung ist perfekt. Klappt wunderbar. Du musst nur deine Klasse erstellen, um Zend_Rest_Route zu erweitern. Sollte die Konstruktor- und Match-Funktionen enthalten. – a2ron44

6

Ich öffnete die Lösung in Github und als ein Composer-Paket. siehe https://github.com/aporat/Application_Rest_Controller_Route.

Ich habe eine neue Klasse, die Zend_Controller_Router_Route erweitert und fügt abiliy individuelle 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'])); 
+0

Ihre Klasse funktioniert einfach super, danke –

+0

Danke! Lustig ist, dass ich dies ursprünglich für meine URL 'user /: user_id/messages' verwenden wollte, die in Ihrem Beispiel die genaue URL war! –