Symfony2: URLs with trailing slash and an optional parameter

大兔子大兔子 提交于 2019-12-07 01:18:23

问题


I want all URLs in my application to have a trailing slash. I have the following route in my route.yml:

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

Requests to '/foo/1/' work fine, however requests to '/foo/' are not matched because of the trailing slash in the URL pattern.

How can I define routes with trailing slashes and an optional parameter? I am aware I can define 2 different routes for the two cases, but I want to avoid that.


回答1:


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/




回答2:


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.



来源:https://stackoverflow.com/questions/10091518/symfony2-urls-with-trailing-slash-and-an-optional-parameter

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