2010-03-28 2 views
0

Для нашей CMS у нас есть менеджер сайтов, который определяет древовидную структуру сайта (sitemap, если вы хотите назвать это).Различные схемы URL для Zend Framework

Возможный URL-адрес: www.example.com/our-team/developers/chris/, который будет отображаться в древовидной структуре узлу chris, дочерью разработчиков, который, в свою очередь, является дочерью команды.

Все это на месте и работает благодаря прекрасно реализованному поведению вложенного набора в доктрине. Единственное, что я изо всех сил пытаюсь заставить его работать в передней части нашего сайта. По умолчанию объект запроса схемы Zend ожидает схему контроллера/action/key/value/key/value/... URI, но это не совсем подходит моим потребностям, я бы хотел пропустить весь контроллер, действие и ключевую часть и ограничить значения. Что-то вроде value1/value2/value3/value4/...

У кого-нибудь есть идея, как это сделать?

Редактировать: Еще один фон: Возможно, вы задаетесь вопросом, как я сопоставляю запрос с контроллером/действием? Ну, каждый запрос, который не является диспетчеризованным (таким образом, не является существующим контроллером/действием) обрабатывается контроллером ошибок, он там, где я сопоставляю URI запроса с контуром в древовидной структуре и, таким образом, могу отображать страницу (если путь соответствует), если он не соответствует контроллеру ошибки, он просто продолжается, и ответ 404 отвечает.

+1

Где вы определяете, какое действие нужно вызывать, когда отображается страница «chris»? –

+0

Ну, на самом деле это обрабатывается через Контроллер ошибок, для каждого запроса, который не является диспетчером, вызывается контроллер ошибок, и там я проверяю, соответствует ли путь пути в древовидной структуре, если он отправляет страницыController, иначе просто позвольте контроллер ошибок продолжается – ChrisR

ответ

3

Я выполнил маршрутизацию, расширив класс Zend_Controller_Router_Route_Abstract.

Добавив его в стек маршрутизатора, можно использовать систему «водопад», используя множество маршрутов.

I published the code в моем блоге и работает Bittarman.

2

Этот пример использования карт до controller/action/value, который аналогичен стандарту. При определении своего маршрута используйте что-то вроде :controller/:action/:username.

См. Using a Router в руководстве по ZF.

+0

Это то, что я знаю, да, на самом деле это то, что я хочу обойти.На самом деле все, что я хочу, - это возможность извлекать каждую отдельную часть из URI в моем PagesController ... что-то вроде $ this -> _ request-> getParamNr (5), которое выведет меня на пятую часть URI независимо от фактического ключа или значение, связанное с этой частью uri – ChrisR

+1

Я предполагаю, что нумерованный подход будет работать до тех пор, пока вы не достигнете определенной степени восстановления URL-адресов (*/наша команда/разработчики/chris * будет */наша команда/chris *), желая больше читаемый код в контроллерах ('$ this-> getParam (5)' vs '$ this-> getParam ('userId')' или хочет связать URL-адреса с моделями, разрешив им иметь то же имя ('UserModel' может используется в 'UserController'). Вероятно, есть больше причин. – chelmertz

+1

Если вам все же нужны нумерованные URL-адреса, вы должны иметь возможность использовать нумерованные индексы' $ this-> getRequest() -> getParams() 'в контроллере, но вам все равно придется использовать некоторую переписывание (и ловить все в ErrorController - это хороший способ потерять keepabi в том смысле, что это не имеет смысла.) – chelmertz

1

Во-первых, я бы прекратил использовать контроллер ошибок для обеспечения маршрутизации. Это просто плохая джуджу.

Теперь есть несколько вещей, которые следует учитывать при работе с такой структурой маршрутизации, одна заключается в том, что это конфликтует с маршрутом по умолчанию, поэтому, если вы полагаетесь на него, вам будет необходимо строго соблюдать то, как вы это делаете ,

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

Вы также можете передать соответствующие данные в параметрах запроса (содержимое страницы, сведения о членах команды и т. Д.), Чтобы в вашем действии не требовался дальнейший поиск в db, а ваш код действия, если он был свободен от поиска.

Смежные вопросы