Маршрутизация в модуле не работает Yii 2

Я новичок в Yii 2, и моя проблема связана с маршрутизацией внутри модуля. В моем приложении есть модуль, который представляет собой профильный кабинет как для пользователей, так и для администраторов. Я создал CabinetController вместо DefaultController, а также создал AdminController и UserController.

Что я хочу? Я хочу, чтобы этот запрос CabinetController получил и перенаправил его либо AdminController, либо UserController после проверки того, является ли пользователь администратором или нет.

В файле конфигурации я установил маршрут по умолчанию для модуля как «шкаф» (насколько я понимаю, это имя для контроллера по умолчанию). И в части «правил» UrlManager я написал следующее:

'modules' => [
  'cabinet' => [
    'class' => 'app\modules\cabinet\Module',
    'defaultRoute' => 'cabinet'
  ],
  'utility' => [
    'class' => 'c006\utility\migration\Module',
  ],

],
'urlManager' => [
  'enablePrettyUrl' => true,
  'showScriptName' => false,

  'rules' => [
    '<_c:\w+>/' => '<_c>/',
    '<_c:[\w\-]+>/<_a:\w+>' => '<_c>/<_a>',
    '<_m:cabinet>/<_a:\w+>' => '<_a>',

  ],
],

Если я захожу на «my-site.com/cabinet», он работает нормально и открывает «admin/index», потому что я перенаправил этот запрос на AdminController/actionIndex, но как только я перехожу куда-то вроде «my-site.com/ кабинет/пользователи", он отвечает 404 NotFound. Я открываю логгер и вижу: исключение 'yii\base\InvalidRouteException' с сообщением 'Невозможно разрешить запрос "кабинет/рабочий стол"

Это мой CabinetController и то, как я перенаправляю запросы на Admin/UserController:

public function init()
{
  parent::init();
  $this->user = $this->findModel();
  $this->controllerToUse = $this->user->isAdmin() ? 'admin' : 'user';
}

public function actionIndex()
{
  return $this->module->runAction($this->controllerToUse . '/' . $this->action->id);
}

Если я изменю defaultAction в CabinetController, он запустит это действие, как и ожидалось. Или, если я снова зайду на «my-site.com/cabinet/admin/users», он работает хорошо, потому что он нашел контроллер в URL-адресе (как я думаю).


person Timur Gilauri    schedule 16.03.2017    source источник


Ответы (1)


Маршрутизация может быть немного сложной в Yii2, она следует нескольким правилам, которые вам нужно понять, которые можно найти здесь

Но если я правильно вас понял, Admin/UserController является частью модуля Cabinet? и вы хотите, чтобы Yii перенаправлял /cabinet/users в /cabinet/admin/users

Вам нужно будет добавить некоторые правила в свой UrlManager, см. Правила

Пример:

'rules' => [
    '<module:cabinet>/<action:\w+>' => '<module>/admin/<action>',
],

Надеюсь, поможет

person Tim    schedule 16.03.2017