2013-03-07 2 views
0

Мой сайт позволяет создавать проекты, и существует несколько типов проектов (например, шаблоны проектов).Маршрутизация имен динамических действий Zend Framework

Что я хочу сделать, это одно действие, которое обрабатывает все типы проектов. В настоящее время для каждого типа проекта у меня есть отдельное действие и представление. Я хочу направить их всех на одно действие.

Вот что я придумал до сих пор, это не работает.

resources.router.routes.new_project.route = "/project/new-:id" 
resources.router.routes.new_project.defaults.controller = "project" 
resources.router.routes.new_project.defaults.module = "site" 
resources.router.routes.new_project.defaults.action = "new" 
resources.router.routes.new_project.reqs.id = "([0-9]+)" 

Так что я хочу, чтобы мои URL-адреса, чтобы выглядеть http://mysite.com/project/new-1 или http://mysite.com/project/new-2, где 1 и 2 являются идентификаторы типа проекта. Оба этих URL-адреса должны быть сопоставлены с действием new в контроллере project.

Возможно ли это в ZF 1.11?

ответ

2

Ваш желаемый формат URL может быть легко достигнуто с помощью регулярного маршрута выражение:

resources.router.routes.new_project.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.new_project.route = "project/new-(\d+)" 
resources.router.routes.new_project.defaults.controller = "project" 
resources.router.routes.new_project.defaults.module = "site" 
resources.router.routes.new_project.defaults.action = "new" 
resources.router.routes.new_project.map.1 = "project_type_id" 
resources.router.routes.new_project.reverse = "project/new-%s" 

Вы можете получить доступ к ID, используя $this->_getParam('project_type_id') в контроллере.

+0

* Почти * что я придумал. Это не сработало для меня, поэтому в 'new_project.route' я удалил начальную косую черту и закончил с«^project/new - (\ d +) ». –

+0

Да, вы совершенно правы, я удалил их из своего ответа. ZF фактически блокирует их, прежде чем выполнять сопоставление маршрутов, но вы, возможно, закончили двойную косую черту в собранном маршруте. –

1

Похоже, что вы не можете указывать переменные URL как части - они должны занимать весь сегмент (где сегмент делится на /), то есть первый символ должен быть :, а затем это имя остальное от стоимости.

См функция __construct в Zend/Controller/Router/Route.php (строки 158..196) - это только проверяет, если substr($part, 0, 1) матчи :, (а не искать его где-нибудь в пределах сегмента).


Я думаю, это значит, что вы должны использовать /project/new/:id в Зенде, чтобы использовать те же действия - вы потенциально можете использовать mod_rewrite в Apache, чтобы URL, как /project/new-(\d+) представленного пользователю, но переписана в /project/new/$1 для Зенда.

+0

+1 для кажущегося рабочего решения. Я нашел что-то, что работает для меня из файла Zend's application.ini. Опубликует позже. Спасибо! –