2012-07-06 32 views
15

Làm thế nào để tạo nhiều mẫu trong một định tuyến Symfony?Nhiều mẫu trong một định dạng symfony định tuyến

Thông thường chúng ta có một định tuyến như

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

Có thể có hai mô hình định tuyến?

Something như

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

Trả lời

21

Bạn đang sử dụng Symfony2? Nếu bạn đang có và có thể sử dụng chú thích cho định tuyến của bạn thay vì yml hoặc xml sau đó nó có thể có nhiều tuyến đường được xác định dọc theo những dòng:

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

Sau đó, bạn không cần phải lặp lại trong các phương pháp hành động.

+0

2017: có cách nào Symfony3 để làm điều này với routing.yaml không? –

20

Cách đơn giản nhất là để dublicate khối và làm cho 2 tuyến đường.

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

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

Vì vậy, bạn có khả năng sử dụng cả hai trong số đó trong đường dẫn nếu bạn cần.

Here bạn có thể xem một bài đăng khác về cách sử dụng regex trong định tuyến của mình. Có lẽ bạn có thể viết một regex đơn giản mà kiểm tra xem chỉ số được đặt.

Edit:

Nếu bạn làm việc với các chú thích những gì tôi thích thì bạn có thể viết thêm sau đó một tuyến đường qua một cái gì đó lớp học của bạn như thế này:

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

Ứng dụng có hoạt động với các thông số khác nhau không? Nếu có thì sao? –

1

Chỉ cần để thêm vào câu trả lời của john:

tôi sử dụng nó rất nhiều với FOSJsRoutingBundle:

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

Bằng cách này tôi có một phương pháp và hai tuyến đường.

Chỉ cần nhớ để thiết lập giá trị $ id mặc định:

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

Khi sử dụng các tuyến đường YAML bạn cũng có thể sử dụng cú pháp node anchors biểu để tham khảo một định nghĩa con đường hiện có.

& chỉ định lần xuất hiện đầu tiên của một neo, * chỉ định neo để tham chiếu, << cho biết Symfony yaml parser để hợp nhất nút được chỉ định.

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

blog_index: 
    <<: *blog 
    path: /index 

blog_page: 
    <<: *blog 
    path: /blog 

Hoặc bạn có thể sử dụng neo trên 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 

Tuy nhiên để ngăn chặn SEO kém do nội dung trùng lặp, nó được khuyến khích sử dụng một redirect để thay thế.

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 
Các vấn đề liên quan