Маршрутизация 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 док.

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?

3 ответов


вы можете определить его в двух маршрутах, чтобы иметь только 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

обратите внимание, что вы можете изменить регулярное выражение, определяющее параметры в зависимости от ваших потребностей. Ты можешь!--6-->смотреть на это. Комплекс regex должен быть окружен ". (Пример myvar : "[A-Z]{2,20}")


чтобы уточнить ответ @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 }

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

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

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

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

таким образом вам понадобится только один маршрут в маршрутизации.в формате YML