2010-02-05 5 views
9

С Zend Framework, я пытаюсь построить маршруты для отдыха апи на ресурсы, организованные в следующей схеме:Как настроить иерархические маршруты отдыха Zend?

Как настроить это с помощью Zend_Rest_Route?

Вот как у меня есть настройки маршрута для ресурса пользователей (пользователи /: идентификатор) в моем bootstrap.php файле:

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

[Насколько я понимаю, это поймать всех маршрут так пользователи/324/items/34 приведут к параметрам, установленным как id = 324 и items = 34, и все будет сопоставлено с моделью пользователей (переднего модуля). Оттуда я предполагаю, что могу просто проверить параметр items и получить элемент # 34 для пользователя # 324 по запросу запроса.] < === Я просто проверил его, и похоже, что это не работает:

Acessing/пользователей/234/пункты/43 и

var_dump($this->_getAllParams()); 

в ГЭТ действия результатов контроллера остальное в следующий вывод:

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

каким-то образом оба идентификаторы заблудился ...

Кто-нибудь?

ответ

5

AFAIK, в Zend_Rest_Route нет функции, которая позволяет вам делать что-то вроде этого. Есть предложение, но не уверен, когда оно будет реализовано. Вы можете добавить это в свой Bootstrap, чтобы настроить этот настраиваемый маршрут.

$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); 

идентификатор_пользователя или item_id становятся доступными в itemAction в UsersController в качестве параметров:

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

Спасибо за ваш ответ. Вы правы, мне, наконец, пришлось отказаться от Zend_Rest_Route, поскольку текущая реализация не поддерживает такую ​​схему. Наконец я отправился в Zend_Controller_Router_Route с цепочками: http://stackoverflow.com/questions/2250353/how-do-i-write-chains-of-chains-of-of-route-in-a-ini-file-for- the-zend-framew –

3

Zend_Rest_Route отображает первый параметр после имени контроллера к «идентификатор» только тогда, когда существует один параметр.

Лучшее решение, с которым я столкнулся, - это подкласс Zend_Rest_Route и переопределить функцию match(). Скопируйте функцию соответствия Zend_Rest_Route, но добавьте следующее непосредственно перед комментарием «Дайджест URI Params» (около 60 строк).

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

Это должно предоставить вам функциональность, которую вы ищете.

+0

Я сделал то, что вы говорите. Но тогда, как вы его используете? Я ожидал чего-то вроде этого в моих маршрутах.init routes.tasktypesstatus.map.1 = "type_id", но он не работает:/ – Olivier

+0

Hy, вы решили? Я такой же вопрос – user1066183

+0

Это решение идеально. Работает как шарм. Просто нужно создать свой класс для расширения Zend_Rest_Route. Должны включать конструктор и функции соответствия. – a2ron44

6

Я открываю решение в github и как композиторский пакет. см. https://github.com/aporat/Application_Rest_Controller_Route.

Я добавил новый класс, который расширяет Zend_Controller_Router_Route и добавляет abiliy добавить пользовательские успокоительные маршруты, такие как

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

Ваш класс отлично работает, спасибо –

+0

Спасибо! Забавно, что я изначально хотел использовать это для своего URL-адреса 'users /: user_id/messages', который был точным URL-адресом в вашем примере! –