Я хочу создать 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, я могу это реализовать.
Просто настройте свое правило со значениями по умолчанию ваших параметров следующим образом:
'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,
]
]
]
],
Все параметры, которые имеют значение по умолчанию, не требуются и могут быть пропущены. Вот примеры поведения:
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)
Это работает немного лучше, так как позволяет любое количество необязательных параметров, отлично, если, например, вы создаете дерево категорий, которое может быть на уровне x глубоким (вам также не нужно пули, если не нужно):
В config:
'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...
}
Ужасно, что это вопрос на 2 года, и ответ такой простой.
Идея состоит в том, что по какой-то причине, когда ActiveForm плохо настроен для запросов GET, особенно в отношении действия, это вызовет этот странный эффект.
Объяснение: Причина такого поведения объясняется уникальной проверкой, необходимой в методе Yii Html :: beginForm. Параметры запроса в действии игнорируются для метода GET, поэтому Yii Html :: beginForm использует скрытые входы для каждого параметра GET, чтобы добавить их обратно. Эти скрытые входы укладываются поверх последнего вызова URI с каждой подачей. "Предыдущая тема следующая тема"
Это можно решить, просто добавив хорошо настроенное действие в форму $ form = ActiveForm.
На Yii2:
$form = ActiveForm::begin([
'method' => 'get',
'action' => Url::to(['/search']),
]);
Это избавится от этого ужасного эффекта. Для получения дополнительной информации об этом читайте форум Yii
Надеюсь, это поможет любому другому, который работает над проблемой.