Symfony2: URLs with trailing slash and an optional parameter

岁酱吖の 提交于 2019-12-05 04:57:49

In a separate but related case, you can match the following three patterns:

/foo
/foo/
/foo/page/1

by eliminating the trailing backslash in the route and relaxing the regular expression to match 0 or more characters (*), instead of 1 or more (+):

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

However that will not match /foo/page/1/

Perhaps its easier to define the Controller over an annotation.

in route.yml:

MineTestBundle:
    resource: "@MineTestBundle/Controller/"
    type:     annotation

Then you can define the route direct in your controller.

/**
 * @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);
    }
}

Now when you try to access /foo you come to the indexAction and when you access /foo/1/ you come to the pageAction.

Edit:

Sorry for the misunderstanding. I've tried to reproduce your problem. The easiest way is to define 2 Routes in your config like this:

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: ".+"

In the Route without the parameter {page} You can set the page default to 1.

But here in the Cookbook is a chapter How to allow a "/" character in a route parameter so its possible to allow a / in the route so all that comes after /foo/123/234/ is in the variable $page and you can split them for yourself in your function.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!