Глубокие маршруты в Zend Framework без модулей - как? - PullRequest
0 голосов
/ 18 декабря 2008

Я пишу несколько маршрутов для службы REST. Один из URI моего ресурса выглядит следующим образом

ресурсы / пользователь /: ID

Я также хочу дать доступ к отдельным атрибутам пользователя, которые выглядели бы так:

ресурсы / пользователь /: идентификатор /: атрибут

Но когда я пытаюсь определить этот последний маршрут, он не работает. Вот мой Ини, где определены маршруты

routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"

routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"

Когда я пытаюсь получить доступ к ресурсам / user / 4 / reviews в моем браузере, я получаю следующий вывод

An error occurred
Page not found
Exception information:

Message: Invalid controller specified (resources)
Stack trace:

#0 /usr/local/lib/ZendFramework/ZendFramework-1.7.1-minimal/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /home/baileyp/public_html/web/index.php(50): Zend_Controller_Front->dispatch()
#2 {main}

Request Parameters:

array(4) {
  ["controller"]=>
  string(9) "resources"
  ["action"]=>
  string(4) "user"
  [10]=>
  string(7) "reviews"
  ["module"]=>
  string(7) "default"
}

Итак, мой 2-й маршрут явно не обрабатывается правильно, так как контроллер - это «ресурсы», а действие - «пользователь». Что я здесь не так делаю? На сайте Zend я не нашел примеров, иллюстрирующих, как это реализовать.

И я не хочу использовать модули просто для того, чтобы это сделать - избегать создания папок и тому подобного, чтобы просто соответствовать URI, - вот и вся цель системы маршрутизации.

Ответы [ 2 ]

1 голос
/ 16 февраля 2009

Не уверен, определяете ли вы оба эти значения рядом. По моему опыту, первый маршрут, который вы пытаетесь отобразить, на самом деле будет отлично обрабатываться вторым (благодаря значению по умолчанию, которое вы указали для attribute).

Таким образом, этот маршрут:

foo.com/resources/user/:id/:attribute

С этим звонком:

foo.com/resources/user/12345/

Предполагается, что ваше значение атрибута по умолчанию:

foo.com/resources/user/12345//

Поскольку пустое значение может быть удалено вашим веб-сервером (apache рассматривает несколько слешей как один слеш), я бы рекомендовал установить в качестве атрибута значение по умолчанию для того, что может быть вызвано по имени, и оно будет работать подобно index.html файл в папке:

foo.com/resources/user/12345/
foo.com/resources/user/12345/general/ (same result)

Удача в устранении неполадок - построчное комментирование значений и требований маршрута по умолчанию. В конечном итоге вы видите «край» самого маршрута (так как он вернется к значениям по умолчанию, если вы предоставите ему меньше информации).

Также, в вашем примере, обратите внимание, что вы определяете свои id требования дважды:

 routes.user_attribute.reqs.id = "\d+"
 routes.user_attribute.reqs.id = "reviews|lists"

Будет скорректировано на:

 routes.user_attribute.reqs.id = "\d+"
 routes.user_attribute.reqs.attribute = "reviews|lists"

Может повлиять и на ваши результаты. Надеюсь, это поможет.

1 голос
/ 18 декабря 2008

Я думаю, вам следует изменить только порядок правил ... поэтому сначала вы должны поставить более конкретные правила сверху, а более общие - снизу!

routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user 
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"

routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"

У меня была похожая проблема, и она исправила мою проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...