yii2 Управление URL-адресами двух именованных под-шаблонов
У меня есть структура модуля в моем приложении Yii 2.0, поэтому мне нужно называть такие вещи, как
"module/controller/action"
Но 90% модулей и контроллеров имеют одинаковые имена, например выглядит
"news/news/index"
"support/support/index",
"profile/profile/update"
Это выглядит не очень хорошо, я хотел бы видеть только "профиль / обновление"... Затем я создаю следующее правило в UrlManager:
"<controller:\w+>/<action:\w+>" => "<controller>/<controller>/<action>"
Это приводит меня к ошибке: "preg_match(): Компиляция не удалась: два именованных подшаблона имеют одно и то же имя со смещением 35"
Как решить эту проблему вместо создания разных правил для каждого модуля, я не хочу, чтобы в моем конфигурационном файле было несколько правил для десятков модулей.
2 ответа
Я нашел лучшее решение. PCRE поддерживает модификатор "?J", который позволяет дублировать имена для подшаблонов. Все, что нам нужно, это добавить этот модификатор в наш шаблон, который Yii будет использовать для анализа URL. К сожалению, мы должны добавить его вручную, в yii/web/UrlRule изменить строку:
$this->_routeRule = '#^' . strtr($this->route, $tr2) . '$#u';
чтобы:
$this->_routeRule = '#^(?J)' . strtr($this->route, $tr2) . '$#u';
Это хорошая причина для именования контроллеров по умолчанию, таких как DefaultController. Так правило "<module:\w+>/<action:\w+>" => "<module>/default/<action>"