Несколько шаблонов в одиночной маршрутизации symfony

Как сделать несколько шаблонов в одной маршрутизации 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 }

Ответы

Ответ 1

Используете ли вы Symfony2? Если вы используете и можете использовать аннотации для своей маршрутизации вместо yml или xml, тогда возможно иметь несколько маршрутов, определенных по этим строкам:

/**
* @Route("/");
* @Route("/home");
*/

Тогда вам не нужно дублировать метод действия.

Ответ 2

Самый простой способ - дублировать блок и сделать 2 маршрута.

blog:
    pattern:   /
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }

blog_index:
    pattern:   /index
    defaults:  { _controller: AcmeBlogBundle:Blog:index, page: 1 }

Таким образом, у вас есть возможность использовать оба из них в своем пути, если вам это нужно.

Здесь вы можете увидеть другое сообщение о том, как использовать регулярное выражение в вашей маршрутизации. Возможно, вы можете написать простое регулярное выражение, которое проверяет, установлен ли index.

Edit:

Если вы работаете с аннотациями, что я предпочитаю, вы можете написать более одного маршрута над своим классом примерно так:

/**
* @Route("/");
* @Route("/home");
*/

Ответ 3

При использовании маршрутов YAML вы также можете использовать node anchors синтаксис выражения для ссылки на существующее определение маршрута.

& указывает первое вхождение якоря, * указывает привязку к ссылке, << сообщает Symfony yaml parser для объединения указанного node.

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 из-за дублирования контента рекомендуется использовать redirect.

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

Ответ 4

Просто добавьте в ответ Джона:

Я использую его много с 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)
{
   ...
}