2012-07-06 7 views
15

Jak utworzyć wiele wzorców w jednym routerze Symfony?Wielokrotny wzorzec w pojedynczym routingu symfony

Normalnie mamy routingu jako

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

Czy można mieć dwa routingu wzory?

Coś

blog: 
    #Below pattern to match with '/' or '/index'  
    pattern: {/ , /index} 
    defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } 

Odpowiedz

21

używasz Symfony2? Jeśli jesteś i może używać adnotacji dla routingu zamiast yml lub XML to jest możliwe, aby mieć wiele tras zdefiniowane wzdłuż tych linii:

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

Wtedy nie trzeba powielać metody działania.

+0

jest 2017: czy istnieje sposób Symfony3 to zrobić z routing.yaml? –

20

Najłatwiej jest do dublicate bloku i zrobić 2 tras.

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

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

Masz więc możliwość korzystania z obu na swojej ścieżce, jeśli jej potrzebujesz.

Here można zobaczyć inny post, jak korzystać z regex w routingu. Być może możesz napisać proste wyrażenie, które sprawdzi, czy ustawiony jest index.

Edit:

Jeśli pracujesz z adnotacjami co wolę wtedy można napisać więcej niż jedną drogę nad klasą coś takiego:

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

Czy to działa z różnymi parametrami? Jeśli tak, to w jaki sposób? –

1

Wystarczy dodać do odpowiedzi Jana:

używam go dużo z FOSJsRoutingBundle:

/** 
* @Route("/", name="route_name_1", options={"expose"=true}) 
* @Route("/{id}", name="route_name_2", options={"expose"=true}) 
* @Method("GET") 
* @Template() 
*/ 

ten sposób mam jedną metodę i dwóch tras.

Wystarczy pamiętać, aby ustawić domyślną wartość $ Id:

public function indexAction($id = null) 
{ 
    ... 
} 
7

Podczas korzystania trasy YAML można również użyć składni node anchors ekspresji odwołać istniejącą definicję trasy.

& określa pierwsze wystąpienie kotwicy, * określa kotwicę do odniesienia << opowiada Symfony yaml parser scalić określony węzeł.

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

blog_index: 
    <<: *blog 
    path: /index 

blog_page: 
    <<: *blog 
    path: /blog 

Alternatywnie można użyć kotwic na route attribute value.

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 

Jednak aby zapobiec ubogich SEO ze względu na powielanie treści, zaleca się stosowanie redirect zamiast.

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