我想生成可以处理多个参数的URL,如下所示。
www.mysite.com/index.php/controller/param1/param2/param3/param4/mySlug
但仍然能够灵活并传递更少的信息
www.mysite.com/index.php/controller/param1/parama/my_slug_2
如果能让这更容易,我们可以假设最后总是有一个slu .. Yii2 urlManager中有什么东西可以实现吗。
答案 0 :(得分:1)
只需使用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,
]
]
]
],
所有具有默认值的参数都不是必需的,可以跳过。以下是行为的示例:
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)
答案 1 :(得分:0)
可怕这是一个2年的问题,答案很简单。
这个想法是由于某种原因,当ActiveForm没有很好地配置GET请求时,特别是对于动作,它会导致这种奇怪的效果。
说明: 上述行为的原因是由于Yii的Html :: beginForm方法需要进行独特的验证。对于GET方法,操作中的查询参数将被忽略,因此Yii的Html :: beginForm使用每个GET参数的隐藏输入来添加它们。每次提交时,这些隐藏的输入都会堆叠在最后一次URI调用上。 «Yii论坛»
只需在$ form = ActiveForm中添加配置良好的操作即可解决此问题。
在Yii2上:
$form = ActiveForm::begin([
'method' => 'get',
'action' => Url::to(['/search']),
]);
这将摆脱这种可怕的影响。 有关此内容的详细信息,请阅读Yii forum
我希望这可以帮助解决问题的任何其他问题。
答案 2 :(得分:0)
这会更好一些,因为它允许任意数量的可选参数,例如,如果您要创建的类别树的深度可能是x层(如果不需要,则也不需要子弹),这很好: / p>
在配置中:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
[
'pattern' => 'test/<params:.*>/<slug>',
'route' => 'site/test',
'encodeParams' => false,
'defaults' => [
'params' => null,
]
]
]
],
然后您可以在控制器中获取所有可能参数的数组:
public function actionTest($params = null, $slug) {
if (!empty($params)) {
$params = explode('/', $params);
}
// do whatever...
}