Symfony使用可选参数路由yml文件

时间:2016-11-24 09:55:52

标签: php symfony routing yaml param

我正在尝试在symfony中路由URL,要匹配的URL有3个变种

/test/param1/test.json
/test/param1/param2/test.json
/test/param1/param2/param3/test.json

我想用一个控制器执行此操作,param2和param3是可选参数。

我已经在要求 param2和param3中尝试使用正则表达式来允许字符串而没有任何内容,但我无法将所有3条路径匹配以转到同一个控制器。

由于

3 个答案:

答案 0 :(得分:1)

您只能使用一个允许“/”的路径参数,然后在控制器中拆分参数。像这样:

_test:
    path:     /test/{params}/test.json
    defaults: { _controller: AppBundle:Demo:test }
    requirements:
        params: .+

控制器:

public function testAction(Request $request, $params)
{
    dump($params); // param1/param2/param3
    $paramsArray = split("/", $params);
}

这适用于任何数量的参数!

答案 1 :(得分:0)

您可以做的是定义不同的路线并将它们分配给一个Controller-Action:

testparam123:
   pattern:   /test/{param1}/{param2}/{param3}/test.json
   defaults:  { _controller: Bundle:Controller:test}
testparam12:
       pattern:   /test/{param1}/{param2}/test.json
       defaults:  { _controller: Bundle:Controller:test}
testparam1:
       pattern:   /test/{param1}/test.json
       defaults:  { _controller: Bundle:Controller:test}

然后你的控制器动作方法看起来像

public function testAction($param1,$param2=NULL,$param3=NULL) {
   // do something
}

希望有所帮助

答案 2 :(得分:0)

这不适用于一个路由配置。如果params应该是可选的,那么你必须将查询参数留空,如

/test/param1/param2//test.json

这里symfony知道param3是空的。否则你永远不知道url的哪个部分是空的,因为你可以做到这一点:

/test/param1/param3/test.json

symfony应该如何识别param2缺失并且param3会被给出? 您可以从

更改逻辑
/test/param1/param2/param3/test.json

/test/param1-param2-param3-test.json

这样更容易处理。