2013-03-08 2 views
9

Я пытаюсь настроить некоторые маршруты в Symfony2 по следующей схеме:Symfony2 маршрутизации: два дополнительных параметра - по крайней мере, один требуется

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

Оба параметра не являются обязательными - поэтому следующие сценарии должны работать:

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

Я установил свою маршрутизацию.yml в соответствии с symfony2 doc.

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

Это прекрасно работает до сих пор. Проблема в том, что если оба параметра отсутствуют или пусты, маршрут не должен работать. Таким образом,

www.myaweseomesite.com/payment/customer/ 

не должно работать. Есть ли способ сделать это с помощью Symfony2?

+0

Как выглядят параметры? Имеют ли они спецификацию длины или просто цифры? Просто письма? Письма и цифры? Потому что, если они имеют любую длину с только цифрами, это невозможно, так как вы не можете знать, что есть. –

+0

customerNumber - это цифра, invoiceNumber - строка – marty

ответ

16

Вы можете определить его в двух направлениях, чтобы иметь только 1 косую черту.

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 

Обратите внимание, что вам может потребоваться изменить регулярное выражение, определяющее параметры, в зависимости от ваших конкретных потребностей. Вы можете look at this. Сложное регулярное выражение должно быть окружено ". (Пример myvar : "[A-Z]{2,20}")

+0

Ok. Выглядит странно, но это работает :) Спасибо! – marty

+0

@marty рад, что я мог бы помочь! Чтобы дать немного больше информации, первый маршрут соответствует вашим двум первым типам. А второй - третий. (oops Я забыл удалить «customerNumber: null» с первого маршрута, иначе он примет маршрут без каких-либо параметров. Я обновил, чтобы это отразить!) –

4

Чтобы уточнить @Hugo ответ, пожалуйста, найти ниже конфигурации с аннотациями:

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

Согласно документации:

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

установить значение по умолчанию для необязательных параметров в аннотациях в контроллере:

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

Таким образом вам нужен только один маршрут в routing.yml

Смежные вопросы