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

时间:2012-04-10 15:18:49

标签: symfony routing

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

foo_route:
    pattern:  /foo/{page}/
    defaults: { _controller: FooBundle:Foo:list, page: 1 }
    requirements:
      page:  \d+

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

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

2 个答案:

答案 0 :(得分:6)

在一个单独但相关的案例中,您可以匹配以下三种模式:

/foo
/foo/
/foo/page/1

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

foo_route:
    pattern:  /foo/{page}
    defaults: { _controller: FooBundle:Foo:list, page: 1 }
    requirements:
      page:  \d*

然而,这与/ foo / page / 1 /

不匹配

答案 1 :(得分:1)

也许通过注释更容易定义Controller。

route.yml

中的

MineTestBundle:
    resource: "@MineTestBundle/Controller/"
    type:     annotation

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

/**
 * @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);
    }
}

现在,当您尝试访问/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: ".+"

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

但是在Cookbook中有一章How to allow a "/" character in a route parameter因此可以在路径中允许 / ,因此/foo/123/234/之后的所有内容都在变量{{1}中你可以在你的函数中为自己拆分它们。