我正在尝试在symfony中路由URL,要匹配的URL有3个变种
/test/param1/test.json
/test/param1/param2/test.json
/test/param1/param2/param3/test.json
我想用一个控制器执行此操作,param2和param3是可选参数。
我已经在要求 param2和param3中尝试使用正则表达式来允许字符串而没有任何内容,但我无法将所有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
这样更容易处理。