yii2 URL Management два именованных подшаблона

У меня есть структура модуля в моем приложении 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»

Как решить эту проблему вместо того, чтобы создавать разные правила для каждого модуля, я не хочу, чтобы в моем файле конфигурации было несколько правил для десятков модулей.


person kirSeNN    schedule 27.08.2014    source источник


Ответы (2)


Я нашел лучшее решение. PCRE поддерживает модификатор "?J", который позволяет дублировать имена для подшаблонов. Все, что нам нужно, это добавить этот модификатор в наш шаблон, который Yii будет использовать для разбора URL-адреса. К сожалению, мы должны добавить его вручную, в yii/web/UrlRule изменить строку:

$this->_routeRule = '#^' . strtr($this->route, $tr2) . '$#u';

to:

$this->_routeRule = '#^(?J)' . strtr($this->route, $tr2) . '$#u';
person kirSeNN    schedule 29.08.2014

Это хорошая причина для именования контроллеров по умолчанию, таких как DefaultController. Итак, правило "<module:\w+>/<action:\w+>" => "<module>/default/<action>"

person zelenin    schedule 28.08.2014
comment
Да, это похоже на решение, но я бы назвал его своего рода грязным решением. Имея множество классов с именем DefaultController, я полагаю, что это не лучшая практика. В любом случае, если я не найду ничего лучше, я воспользуюсь вашим советом. Спасибо - person kirSeNN; 28.08.2014