2013-03-08 23 views
9

Tôi đang cố gắng để thiết lập một số tuyến đường trong symfony2 cho mô hình sau:Symfony2 Routing: Hai thông số tùy chọn - ít nhất là một yêu cầu

www.myaweseomesite.com/payment/customer/{customernumber}/{invoicenumber} 

Cả hai thông số là không bắt buộc - vì vậy các kịch bản sau đây phải làm việc:

www.myaweseomesite.com/payment/customer/{customerNumber}/{invoiceNumber} 
www.myaweseomesite.com/payment/customer/{customerNumber} 
www.myaweseomesite.com/payment/customer/{invoiceNumber} 

Tôi thiết lập định tuyến.yml theo symfony2 doc.

payment_route: 
pattern: /payment/customer/{customerNumber}/{invoiceNumber} 
defaults: { _controller: PaymentBundle:Index:payment, customerNumber: null, invoiceNumber: null } 
requirements: 
    _method: GET 

Điều này rất hữu ích. Vấn đề là, nếu cả hai tham số bị thiếu hoặc trống, tuyến đường sẽ không hoạt động. Vì vậy,

www.myaweseomesite.com/payment/customer/ 

không hoạt động. Có cách nào để làm điều này với Symfony2?

+0

Các tham số trông như thế nào? Chúng có độ dài đặc trưng hay chỉ là chữ số? Chỉ là chữ cái? Chữ cái và chữ số? Bởi vì nếu chúng là cả hai chiều dài bất kỳ với chỉ chữ số, điều này là không thể, vì bạn không thể biết cái nào là cái nào. –

+0

customerNumber là một chữ số, invoiceNumber là một chuỗi – marty

Trả lời

16

Bạn có thể xác định nó theo hai tuyến để đảm bảo chỉ có 1 dấu gạch chéo.

payment_route_1: 
    pattern: /payment/customer/{customerNumber}/{invoiceNumber} 
    defaults: { _controller: PaymentBundle:Index:payment, invoiceNumber: null } 
    requirements: 
     customerNumber: \d+ 
     invoiceNumber: \w+ 
     _method: GET 

payment_route_2: 
    pattern: /payment/customer/{invoiceNumber} 
    defaults: { _controller: PaymentBundle:Index:payment, customerNumber: null } 
    requirements: 
     invoiceNumber: \w+ 
     _method: GET 

Xin lưu ý rằng bạn có thể phải thay đổi regex xác định thông số tùy thuộc vào nhu cầu chính xác của bạn. Bạn có thể look at this. Phức tạp phức tạp phải được bao quanh bởi ". (Ví dụ myvar : "[A-Z]{2,20}")

+0

Ok. Trông lạ, nhưng nó hoạt động :) Cảm ơn! – marty

+0

@marty vui vì tôi có thể giúp! Để cung cấp thêm thông tin, tuyến đường đầu tiên khớp với 2 loại đầu tiên của bạn. Và loại thứ hai là loại thứ ba. (oops Tôi đã quên xóa 'customerNumber: null' khỏi tuyến đầu tiên, nếu không nó sẽ chấp nhận tuyến mà không có bất kỳ tham số nào. Tôi đã cập nhật để phản ánh điều đó!) –

4

Để xây dựng trên câu trả lời @Hugo, xin vui lòng tìm thấy bên dưới cấu hình với chú thích:

/** 
* @Route("/public/edit_post/{post_slug}", name="edit_post") 
* @Route("/public/create_post/{root_category_slug}", name="create_post", requirements={"root_category_slug" = "feedback|forum|blog|"}) 
* @ParamConverter("rootCategory", class="AppBundle:Social\PostCategory", options={"mapping" : {"root_category_slug" = "slug"}}) 
* @ParamConverter("post", class="AppBundle:Social\Post", options={"mapping" : {"post_slug" = "slug"}}) 
* @Method({"PUT", "GET"}) 
* @param Request $request 
* @param PostCategory $rootCategory 
* @param Post $post 
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse 
*/ 
public function editPostAction(Request $request, PostCategory $rootCategory = null, Post $post = null) 
{ Your Stuff } 
0

Theo tài liệu:

http://symfony.com/doc/current/routing/optional_placeholders.html

đặt một giá trị mặc định cho các thông số tùy chọn trong các chú thích trong bộ điều khiển:

/** 
* @Route("/blog/{page}", defaults={"page" = 1}) 
*/ 
public function indexAction($page) 
{ 
    // ... 
} 

Bằng cách này, bạn chỉ cần một tuyến đường trong định tuyến.yml

Các vấn đề liên quan