Php 要在URL中传递的多个变量-Yii2
我想生成可以处理多个参数的URL,如下所示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
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...
}