Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 要在URL中传递的多个变量-Yii2_Php_Yii_Yii2_Yii Url Manager - Fatal编程技术网

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

Php 要在URL中传递的多个变量-Yii2,php,yii,yii2,yii-url-manager,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 我们可以假设最后总是有一个弹头,如果这样做更容易的话。Yi2 urlManager中是否有我可以实现的功能。只需使用参数的默认值配置规则,如下所示: 'u

我想生成可以处理多个参数的URL,如下所示

www.mysite.com/index.php/controller/param1/param2/param3/param4/mySlug 
但仍然能够灵活地传递较少的信息

www.mysite.com/index.php/controller/param1/parama/my_slug_2 

我们可以假设最后总是有一个弹头,如果这样做更容易的话。Yi2 urlManager中是否有我可以实现的功能。

只需使用参数的默认值配置规则,如下所示:

'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,
                ]
            ]
        ]
    ],


可怕的是,这是一个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']),
            ]);
这将消除这种可怕的影响。 欲了解更多信息,请阅读


我希望这有助于解决这个问题的任何其他方面。

这会更好一些,因为它允许任意数量的可选参数,如果您正在创建一个可能有x级深度的类别树(如果不需要,您也不需要slug):

在配置中:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'pattern' => 'test/<params:.*>/<slug>',
            'route' => 'site/test',
            'encodeParams' => false,
            'defaults' => [
                'params' => null,
            ]
        ]
    ]
],

这看起来很好,一旦实现就会回来让你知道它是否有效。@ahervin它对你成功了吗?我已经记下了在实现时更新这个答案的任务。抱歉延迟。我会将此标记为正确,因为它有时会工作,但我需要对一些冲突规则进行排序。您始终可以创建自己的类来扩展
UrlRule
,并实现自己的逻辑,以正确的顺序处理多个可选参数。
$form = ActiveForm::begin([
                'method' => 'get',
                'action' => Url::to(['/search']),
            ]);
'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...

}