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>"

Другие вопросы по тегам