alex5e
@alex5e

Как подружить urlManager в конфиге c urlManager модуля в Yii2?

Здравствуйте. Не подскажите, как подружить urlManager с правилами в конфиге:
'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            'rules' => [
                '/' => 'site/index',
                '/admin' => 'admin/default/index',
                '<action>'=>'site/<action>',
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
                '<module:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
                '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
                '<module:\w+>/<controller:\w+>' => '<module>/<controller>/index',
            ],
        ],

с правилами описанными в модуле (в данном случае приведен модуль Yii2-user)
/** @var array The rules to be used in URL management. */
    public $urlRules = [
        '<id:\d+>'                    => 'profile/show',
        '<action:(login|logout)>'     => 'security/<action>',
        '<action:(register|resend)>'  => 'registration/<action>',
        'confirm/<id:\d+>/<code:\w+>' => 'registration/confirm',
        'forgot'                      => 'recovery/request',
        'recover/<id:\d+>/<code:\w+>' => 'recovery/reset',
        'settings/<action:\w+>'       => 'settings/<action>'
    ];
  • Вопрос задан
  • 3134 просмотра
Пригласить эксперта
Ответы на вопрос 1
Есть решение для Yii 1:
Сам код нашел в сети, частично допилил его, на предмет кеширования, и на предмет вложенных модулей.
Возможно можно допилить для Yii2
1. В конфиг
/* Правила роутинга для модулей */
            'onBeginRequest' => array('ModuleUrlManager', 'collectRules'),

2. Файл ModuleUrlManager
/**
 * Класс менеджер путей модулей 
 * Активирует urlRules параметр активного модуля
 * Работает с многоуровневой вложеностью модулей
 * Реализовано кеширование urlRules модулей
 */
class ModuleUrlManager {

    static function collectRules() {
        if (!empty(Yii::app()->modules)) {
            $cache = Yii::app()->getCache();
            $route = Yii::app()->getRequest()->getPathInfo();
            $patharray = explode('/', $route);
            $moduleName = substr($route, 0, strpos($route, '/'));
            /* Если роут имеет вид module.html */
            if (empty($moduleName)) {
                $moduleName = substr($route, 0, strpos($route, '.'));
            }

            if (Yii::app()->hasModule($moduleName)) {
                $urlRules = false;
                if ($cache)
                    $urlRules = $cache->get('module.url.rules.' . $moduleName);

                if ($urlRules === false) {
                    $module = Yii::app()->getModule($moduleName);
                    if (isset($module->urlRules)) {
                        $urlRules = $module->urlRules;
                        if ($cache && !empty($urlRules))
                            $cache->set('module.url.rules.' . $module->id, $urlRules);
                    }
                }
                if (!empty($urlRules))
                    Yii::app()->getUrlManager()->addRules($urlRules);
                if (!empty($patharray)) {
                    foreach ($patharray as $pathUnit) {
                        $position = strpos($pathUnit, '.html');
                        if ($position) {
                            $pathUnit = substr($pathUnit, 0, $position);
                        }
                        $urlRules = false;
                        if ($cache)
                            $urlRules = $cache->get('module.url.rules.' . $moduleName . '/' . $pathUnit);

                        if ($urlRules === false) {
                            $module = Yii::app()->getModule($moduleName);
                            if ($module->hasModule($pathUnit)) {
                                $submodule = $module->getModule($pathUnit);
                                if (isset($submodule->urlRules)) {
                                    $urlRules = $submodule->urlRules;
                                    if ($cache && !empty($urlRules))
                                        $cache->set('module.url.rules.' . $submodule->id, $urlRules);
                                }
                            }
                        }
                        if (!empty($urlRules))
                            Yii::app()->getUrlManager()->addRules($urlRules);
                    }
                }
            }
            return true;
        }
    }

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы