2010-02-05 11 views
9

Z Zend Framework, próbuję budować trasy dla API REST zasobów organizowanych w następujący wzór:Jak skonfigurować Trasy hierarchiczne Zend resztą?

Jak skonfigurować to za pomocą Zend_Rest_Route?

Oto jak mam konfigurację trasy o zasobie Użytkownicy (Users /: id) w moim pliku bootstrap.php:

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

[O ile rozumiem, to jest haczyk wszystko tak droga użytkowników/324/szt/34 by wyniki w parametrach określonych jako id = 324 i elementy = 34 i wszystko byłoby przypisane do użytkowników (moduł przedni) model. Stąd myślę, że mógłbym po prostu przetestować parametr item i pobrać pozycję # 34 dla użytkownika # 324 na żądanie pobierania.] < === Właśnie sprawdziłem i nie działa tak:

Acessing/users/234/szt/43 i

var_dump($this->_getAllParams()); 

w akcji Pobierz wyników kontroler Spoczywaj w następujący wynik:

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

jakoś oba identyfikatory got utracone ...

Ktoś?

Odpowiedz

5

AFAIK, nie ma funkcji w Zend_Rest_Route który pozwala zrobić coś takiego. Jest propozycja, ale nie wiadomo, kiedy zostanie wdrożona. Możesz dodać to do swojego Bootstrapa, aby skonfigurować tę niestandardową trasę.

$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 lub item_id stają się dostępne w itemAction w UsersController jako parametry:

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

Dzięki za odpowiedź. Masz rację, w końcu musiałem zrezygnować z Zend_Rest_Route, ponieważ obecna implementacja nie obsługuje takiego schematu. W końcu przeszedłem Zend_Controller_Router_Route z łańcuchami: http://stackoverflow.com/questions/2250353/how-do-i-write-chains-of-chains-of-route-in-a-ini-file-for- the-zend-framew –

3

Zend_Rest_Route odwzorowuje pierwszy parametr po nazwie kontrolera do 'id' tylko wtedy, gdy jest 1 parametr.

Najlepsze rozwiązanie mam wymyślić jest do podklasy Zend_Rest_Route i zastąpić funkcji match(). Skopiuj funkcję dopasowania Zend_Rest_Route, ale należy dodać następujące tuż przed „Digest” URI Params komentarzu (około 60 wierszy w).

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

To powinno dać Ci funkcjonalność, której szukasz.

+0

Zrobiłem to, co mówisz. Ale w takim razie, jak z niego korzystasz? Spodziewałem się czegoś takiego w moim routes.init routes.tasktypesesstatus.map.1 = "type_id", ale to nie działa:/ – Olivier

+0

Hy, czy rozwiązałeś? Jestem tym samym problemem – user1066183

+0

To rozwiązanie jest idealne. Działa jak marzenie. Po prostu musisz stworzyć swoją klasę, aby rozszerzyć Zend_Rest_Route. Powinien zawierać funkcje konstruktora i dopasowywania. – a2ron44

6

I open source roztwór do github i jako pakiet edytora. patrz https://github.com/aporat/Application_Rest_Controller_Route.

Dodałem nową klasę, która rozciąga Zend_Controller_Router_Route i dodaje abiliy dodać niestandardowy spokojny tras, takich jak

$frontController = Zend_Controller_Front::getInstance(); 
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages'])); 
+0

Twoja klasa działa świetnie, dziękuję –

+0

Dzięki! Zabawne jest to, że początkowo chciałem użyć tego dla mojego adresu URL 'users /: user_id/messages', który był dokładnym adresem URL w twoim przykładzie! –

Powiązane problemy