2013-03-08 14 views
9

Próbuję skonfigurować niektóre trasy w Symfony2 do poniższego schematu:Symfony2 Routing: Dwa opcjonalne parametry - przynajmniej jeden wymagany

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

Oba parametry są opcjonalne - tak następujące scenariusze muszą działać:

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

Skonfigurowałem mój routing.yml zgodnie z symfony2 doc.

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

Działa to świetnie do tej pory. Problem polega na tym, że jeśli oba parametry są puste lub puste, trasa nie powinna działać. Więc

www.myaweseomesite.com/payment/customer/ 

nie powinna działać. Czy jest jakiś sposób na zrobienie tego z Symfony2?

+0

Jak wyglądają te parametry? Czy mają specyficzność długości, czy tylko cyfry? Tylko listy? Litery i cyfry? Ponieważ obie są dowolnej długości tylko cyframi, jest to niemożliwe, ponieważ nie możesz wiedzieć, która jest która. –

+0

customerNumber to cyfra, numer faktury to ciąg znaków – marty

Odpowiedz

16

Możesz zdefiniować go na dwie trasy, aby mieć pewność, że zawiera tylko 1 ukośnik.

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 

Należy pamiętać, że może zajść konieczność zmiany wyrażenia definiującego parametry w zależności od konkretnych potrzeb. Możesz look at this. Kompleksowe wyrażenie regularne musi być otoczone przez ". (Przykład myvar : "[A-Z]{2,20}")

+0

Ok. Wygląda dziwnie, ale działa :) Dzięki! – marty

+0

@marty cieszę się, że mogę pomóc! Aby podać nieco więcej informacji, pierwsza trasa odpowiada dwóm pierwszym typom. A drugi - trzeci. (oops zapomniałem usunąć 'customerNumber: null' z pierwszej trasy, inaczej zaakceptuje trasę bez żadnych parametrów. Zaktualizowałem ją, aby to odzwierciedlić!) –

4

Aby rozwinąć @Hugo odpowiedź, proszę znaleźć poniżej config z adnotacjami:

/** 
* @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

Zgodnie z dokumentacją:

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

ustawić wartość domyślną dla opcjonalnych parametrów w adnotacjach w kontrolerze:

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

W ten sposób potrzebujesz tylko jednej trasy w routingu.yml

Powiązane problemy