Как сделать несколько шаблонов в одиночной маршрутизации Symfony?
Обычно мы имеем маршрутизацию как
blog: pattern: / defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Возможно ли иметь два шаблона маршрутизации?
Что-то вроде
blog: #Below pattern to match with '/' or '/index' pattern: {/ , /index} defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Вы используете Symfony2? Если вы используете и можете использовать аннотации для своей маршрутизации вместо yml или xml, тогда возможно иметь несколько маршрутов, определенных по этим строкам:
/** * @Route("/"); * @Route("/home"); */
Тогда вам не нужно дублировать метод действия.
Самый простой способ – дублировать блок и сделать 2 маршрута.
blog: pattern: / defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } blog_index: pattern: /index defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
Таким образом, у вас есть возможность использовать оба из них на своем пути, если вам это нужно.
Здесь вы можете увидеть другое сообщение о том, как использовать регулярное выражение в вашей маршрутизации. Возможно, вы можете написать простое регулярное выражение, которое проверяет, установлен ли индекс .
Редактировать:
Если вы работаете с аннотациями, что я предпочитаю, вы можете написать более одного маршрута по вашему классу примерно так:
/** * @Route("/"); * @Route("/home"); */
При использовании маршрутов YAML вы также можете использовать синтаксис выражения привязки узлов для ссылки на существующее определение маршрута.
&
указывает первое вхождение якоря, *
указывает привязку к ссылке, <<
сообщает симулятору Symmony yaml о слиянии указанного узла.
blog: &blog path: / defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } blog_index: <<: *blog path: /index blog_page: <<: *blog path: /blog
В качестве альтернативы вы можете использовать привязки для значения атрибута маршрута .
blog: path: / defaults: &blog_defaults _controller: AcmeBlogBundle:Blog:index page: 1 blog_index: path: /index defaults: *blog_defaults blog_page: path: /blog defaults: *blog_defaults
Однако для предотвращения плохого SEO из-за дублирования контента рекомендуется вместо этого использовать перенаправление .
blog: path: / defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } blog_index: path: /index defaults: &blog_redirect _controller: FrameworkBundle:Redirect:redirect route: blog permanent: true blog_page: path: /blog defaults: *blog_redirect
Чтобы добавить к ответу Джона:
Я использую его много с FOSJsRoutingBundle:
/** * @Route("/", name="route_name_1", options={"expose"=true}) * @Route("/{id}", name="route_name_2", options={"expose"=true}) * @Method("GET") * @Template() */
Таким образом, у меня есть один метод и два маршрута.
Не забудьте установить значение по умолчанию $ id:
public function indexAction($id = null) { ... }