7

I want all URLs in my application to have a trailing slash. I have the following route in my route.yml:

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

Requests to '/foo/1/' work fine, however requests to '/foo/' are not matched because of the trailing slash in the URL pattern.

How can I define routes with trailing slashes and an optional parameter? I am aware I can define 2 different routes for the two cases, but I want to avoid that.

4

2 回答 2

7

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

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

于 2012-04-17T07:28:38.090 回答
1

在注解上定义控制器可能更容易。

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}的 Route 中,您可以将页面默认设置为1

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

于 2012-04-10T18:31:11.570 回答