多变量的URL传递 - Yii2(Multiple Variables to be passed

2019-09-26 12:42发布

我要生成的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什么我可以实现这一点。

Answer 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)


Answer 2:

太可怕了,这是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论坛

我希望这可以帮助任何其他运行上的问题。



Answer 3:

这工作更好一点,因为它允许任何数量的可选则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...

}


文章来源: Multiple Variables to be passed in URL - Yii2