我希望应用程序中的所有URL都有一个尾部斜杠。我在route.yml中有以下路线:
foo_route:
pattern: /foo/{page}/
defaults: { _controller: FooBundle:Foo:list, page: 1 }
requirements:
page: \d+
对'/ foo / 1 /'的请求工作正常,但是由于URL模式中的尾部斜杠,对'/ foo /'的请求不匹配。
如何定义带斜杠和可选参数的路线?我知道我可以为这两种情况定义两种不同的路线,但我想避免这种情况。
答案 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}中你可以在你的函数中为自己拆分它们。