Symfony2路由:两个可选参数 - 至少需要一个参数

mar*_*rty 10 php routing symfony

我正在尝试在symfony2中为以下模式设置一些路由:

www.myaweseomesite.com/payment/customer/{customernumber}/{invoicenumber}
Run Code Online (Sandbox Code Playgroud)

这两个参数都是可选的 - 因此以下方案必须有效:

www.myaweseomesite.com/payment/customer/{customerNumber}/{invoiceNumber}
www.myaweseomesite.com/payment/customer/{customerNumber}
www.myaweseomesite.com/payment/customer/{invoiceNumber}
Run Code Online (Sandbox Code Playgroud)

我根据symfony2 doc设置了routing.yml .

payment_route:
pattern:  /payment/customer/{customerNumber}/{invoiceNumber}
defaults: { _controller: PaymentBundle:Index:payment, customerNumber: null,  invoiceNumber: null }
requirements:
    _method:  GET
Run Code Online (Sandbox Code Playgroud)

到目前为止,这很有用.问题是,如果两个参数都缺失或为空,则路由不起作用.所以

www.myaweseomesite.com/payment/customer/
Run Code Online (Sandbox Code Playgroud)

不应该工作.有没有办法用Symfony2做到这一点?

Hug*_*ois 16

您可以在两个路径中定义它,以确保只有一个斜杠.

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
Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要根据具体需要更改定义参数的正则表达式.你可以看看这个.复杂的正则表达式必须被包围".(例子myvar : "[A-Z]{2,20}")