我希望我的应用程序中的所有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 /'的请求不匹配.
如何使用尾部斜杠和可选参数定义路径?我知道我可以为这两种情况定义两种不同的路线,但我想避免这种情况.
在单独但相关的情况下,您可以匹配以下三种模式:
/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/
也许通过注释定义控制器更容易。
在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,您可以在函数中自行拆分它们。