php URL中要传递的多个变量-Yii 2

qzlgjiam  于 2023-02-07  发布在  PHP
关注(0)|答案(3)|浏览(146)

我想生成的网址,可以处理多个参数如下。

www.mysite.com/index.php/controller/param1/param2/param3/param4/mySlug

但仍然能够灵活地传递更少的信息

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

我们可以假设在末尾总是有一个slug,如果这样做更容易的话。在Yii2的urlManager中有什么东西可以实现这个吗?

bkkx9g8r

bkkx9g8r1#

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

'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)
mspsb9vt

mspsb9vt2#

这样做效果更好,因为它允许任意数量的可选参数,如果你创建一个x层深的分类树,效果会更好(如果不需要,你也不需要slug):
在配置:

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

然后,您可以在控制器中获得所有可能参数的数组:

public function actionTest($params = null, $slug) {     
    
    $params = !empty($params) ? explode('/', $params) : null;
    
    // do whatever...

}
ubof19bj

ubof19bj3#

可怕的是,这是一个2年的问题,答案是如此简单。
其思想是,由于某种原因,当ActiveForm没有为GET请求配置好时,特别是在操作上,它将导致这种奇怪的效果。
说明:出现上述行为的原因是由于Yii的Html::beginForm方法需要一个唯一的验证。GET方法忽略了action中的查询参数,因此Yii的Html::beginForm使用隐藏的输入为每个GET参数添加它们。这些隐藏的输入会在每次提交时堆叠在最后一个URI调用上。Yii论坛
这可以通过简单地向$form = ActiveForm添加一个配置良好的操作来解决。
在Yii2上:

$form = ActiveForm::begin([
                'method' => 'get',
                'action' => Url::to(['/search']),
            ]);

这将摆脱这种可怕的影响。有关这方面的更多信息,请阅读Yii forum
我希望这对任何其他的,运行在问题上的人有帮助。

相关问题