Symfony2:带有斜杠和可选参数的URL

Ger*_*rry 7 routing symfony

我希望我的应用程序中的所有URL都有一个尾部斜杠.我在route.yml中有以下路线:

foo_route:
    pattern:  /foo/{page}/
    defaults: { _controller: FooBundle:Foo:list, page: 1 }
    requirements:
      page:  \d+
Run Code Online (Sandbox Code Playgroud)

对'/ foo/1 /'的请求工作正常,但是由于URL模式中的尾部斜杠,对'/ foo /'的请求不匹配.

如何使用尾部斜杠和可选参数定义路径?我知道我可以为这两种情况定义两种不同的路线,但我想避免这种情况.

Bra*_*ave 6

在单独但相关的情况下,您可以匹配以下三种模式:

/foo
/foo/
/foo/page/1
Run Code Online (Sandbox Code Playgroud)

通过消除路径中的尾部反斜杠并放宽正则表达式以匹配0个或更多字符(*),而不是1个或更多个(+):

foo_route:
    pattern:  /foo/{page}
    defaults: { _controller: FooBundle:Foo:list, page: 1 }
    requirements:
      page:  \d*
Run Code Online (Sandbox Code Playgroud)

然而,这将不匹配/ foo/page/1/


Ren*_*hle 1

也许通过注释定义控制器更容易。

route.yml中:

MineTestBundle:
    resource: "@MineTestBundle/Controller/"
    type:     annotation
Run Code Online (Sandbox Code Playgroud)

然后您可以直接在控制器中定义路线。

/**
 * @Route("/foo")
 */
class FooController extends Controller {
    /**
     * @Route("/", name="_foo_index")
     * @Template()
     */
    public function indexAction() {
        return array();
    }

    /**
     * @Route("/{page}/", name="_foo_page")
     * @Template()
     */
    public function pageAction($page) {
        return array('page' => $page);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当您尝试访问时,/foo您会看到indexAction,当您访问时,/foo/1/您会看到pageAction

编辑:

很抱歉对于这个误会。我尝试重现你的问题。最简单的方法是在配置中定义 2 个路由,如下所示:

foo_route:
    pattern:  /foo/{page}/
    defaults: { _controller: AcmeDemoBundle:Foo:list }
    requirements:
        name: ".+"  

foo_route_foo:
    pattern:  /foo
    defaults: { _controller: AcmeDemoBundle:Foo:list, page: 1 }
    requirements:
        name: ".+"
Run Code Online (Sandbox Code Playgroud)

在没有参数{page}的 Route 中,您可以将页面默认设置为1

但是,Cookbook 中有一章如何在路由参数中允许使用“/”字符,因此可以在路由中允许使用//foo/123/234/ ,因此后面的所有内容都在变量中$page,您可以在函数中自行拆分它们。