Как настроить иерархические маршруты отдыха Zend?

С помощью Zend Framework я пытаюсь создать маршруты для REST api для ресурсов, организованных в следующем шаблоне:

  • http://example.org/users/
  • http://example.org/users/234
  • http://example.org/users/234/items
  • http://example.org/users/234/items/34

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

Вот как я настроил маршрут для ресурса пользователей (users /: id) в файле 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 по запросу get.] <=== Я только что проверил его, и похоже, что это не работает:

Усыновление / пользователи / 234 / items / 43 и

 var_dump($this->_getAllParams()); 

в результате действия остаточного контроллера получается следующий результат:

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

Каким-то образом оба идентификатора потерялись …

Кто угодно?

Solutions Collecting From Web of "Как настроить иерархические маршруты отдыха Zend?"

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

user_id или item_id становятся доступными в itemAction в UserController в качестве параметров:

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

Я открываю решение в 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'])); 

Zend_Rest_Route сопоставляет первый параметр после имени контроллера с «id» только при наличии 1 параметра.

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

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

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