我要生成的URL,可以处理多个参数如下。
www.mysite.com/index.php/controller/param1/param2/param3/param4/mySlug
但仍然能够灵活传过来的信息较少
www.mysite.com/index.php/controller/param1/parama/my_slug_2
我们可以假设总是有在最后一个塞如果让这更容易。 有没有在Yii2 urlManager什么我可以实现这一点。
我要生成的URL,可以处理多个参数如下。
www.mysite.com/index.php/controller/param1/param2/param3/param4/mySlug
但仍然能够灵活传过来的信息较少
www.mysite.com/index.php/controller/param1/parama/my_slug_2
我们可以假设总是有在最后一个塞如果让这更容易。 有没有在Yii2 urlManager什么我可以实现这一点。
只须配置您的PARAMS这样的默认值,您的规则:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
[
'pattern' => 'test/<param1:\d+>/<param2:\d+>/<param3:\d+>/<param4:\d+>/<slug>',
'route' => 'site/test',
'defaults' => [
'param1' => null,
'param2' => null,
'param3' => null,
'param4' => null,
]
]
]
],
所有参数,具有默认值不是必需的,可以跳过。 这里是行为的例子:
HTTP://yii2.local/test/slug :
skipped.array (size=5)
'param1' => null
'param2' => null
'param3' => null
'param4' => null
'slug' => string 'slug' (length=4)
HTTP://yii2.local/test/2/4/slug
array (size=5)
'param1' => string '2' (length=1)
'param2' => string '4' (length=1)
'param3' => null
'param4' => null
'slug' => string 'slug' (length=4)
太可怕了,这是2年的问题,答案就是这么简单。
我们的想法是,由于某种原因时的ActiveForm没有很好地配置的GET请求,具体的行动,就会造成这种怪异的效果。
说明:之所以上述行为是由于Yii中的HTML :: beginForm方法需要一个独特的验证。 在动作的查询参数GET方法被忽略这样的Yii的HTML :: beginForm使用隐藏的输入每个GET参数添加对方。 这些隐藏的输入被堆叠在过去的URI调用每提交。 «Yii的论坛»
这可以通过简单地增加一个配置好的动作到$形式=的ActiveForm得到解决。
在Yii2:
$form = ActiveForm::begin([
'method' => 'get',
'action' => Url::to(['/search']),
]);
这将摆脱这种可怕的影响。 有关此更多信息阅读的Yii论坛
我希望这可以帮助任何其他运行上的问题。
这工作更好一点,因为它允许任何数量的可选则params的,伟大的,如果比如你要创建一个目录树,可能是X级深(你也不必蛞蝓如果不需要):
在配置:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
[
'pattern' => 'test/<params:.*>/<slug>',
'route' => 'site/test',
'encodeParams' => false,
'defaults' => [
'params' => null,
]
]
]
],
然后,你可以在控制器的所有可能则params的数组:
public function actionTest($params = null, $slug) {
if (!empty($params)) {
$params = explode('/', $params);
}
// do whatever...
}