Symfony2:带有尾随斜杠和可选参数的URL
我希望我的应用程序中的所有URL都有一个尾随斜杠。我的路线中有以下路线。yml:Symfony2:带有尾随斜杠和可选参数的URL,symfony,routing,Symfony,Routing,我希望我的应用程序中的所有URL都有一个尾随斜杠。我的路线中有以下路线。yml: foo_route: pattern: /foo/{page}/ defaults: { _controller: FooBundle:Foo:list, page: 1 } requirements: page: \d+ 对“/foo/1/”的请求工作正常,但是由于URL模式中的尾部斜杠,对“/foo/”的请求不匹配 如何使用尾部斜线和可选参数定义管线?我知道我可以为这两
foo_route:
pattern: /foo/{page}/
defaults: { _controller: FooBundle:Foo:list, page: 1 }
requirements:
page: \d+
对“/foo/1/”的请求工作正常,但是由于URL模式中的尾部斜杠,对“/foo/”的请求不匹配
如何使用尾部斜线和可选参数定义管线?我知道我可以为这两种情况定义两种不同的路由,但我想避免这种情况。也许在注释上定义控制器更容易 在路径.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
时,您将进入索引操作,当您访问/foo/1/
时,您将进入页面操作
编辑:
对不起,误会了。我试图重现你的问题。最简单的方法是在配置中定义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
但是在烹饪书中有一个章节,因此可以允许在路线中使用/,因此
/foo/123/234/
之后的所有内容都在变量$page
中,您可以在函数中自行拆分它们。在单独但相关的情况下,您可以匹配以下三种模式:
/foo
/foo/
/foo/page/1
通过消除路由中的尾随反斜杠并放宽正则表达式以匹配0个或多个字符(*),而不是1个或多个(+):
但是,这与/foo/page/1/不匹配,谢谢您的评论,但实际上只有一个操作带有可选参数page.pageAction;)这是一个参数。这与您的示例相同,但是当您将参数留空时,您有一个默认的索引。不,您误解了。我想要一个路由(带有可选参数),指向一个操作。我当然想避免创建两条路线和/或两个动作。@Gerry:很抱歉我误解了你的问题,编辑了我的帖子。谢谢你,创建两条路线也是我能想到的最好的解决方案(如问题中所述),但也是我想避免的事情。我想允许在参数本身中使用尾随斜杠是一种选择,但仍然有点脏。使用另一条路由有什么不好?
foo_route:
pattern: /foo/{page}
defaults: { _controller: FooBundle:Foo:list, page: 1 }
requirements:
page: \d*