Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2:带有尾随斜杠和可选参数的URL_Symfony_Routing - Fatal编程技术网

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

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/”的请求不匹配 如何使用尾部斜线和可选参数定义管线?我知道我可以为这两

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

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*