要在URL中传递的多个变量 - Yii2

时间:2015-11-09 11:16:10

标签: php yii yii2 yii-url-manager

我想生成可以处理多个参数的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中有什么东西可以实现吗。

3 个答案:

答案 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,
                ]
            ]
        ]
    ],

所有具有默认值的参数都不是必需的,可以跳过。以下是行为的示例:

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)

答案 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...

}