AlexMaxTM
@AlexMaxTM

Как правильно наследовать модуль dektrium/yii2-user?

Всем привет!
Использую модуль Yii2-user. Нужно было сделать так, чтобы при входе неавторизованного пользователя не было никакого меню, а только форма ввода логина и пароля. Для этого сделал следующие вещи.
1. Создал модуль users.
namespace app\modules\users;

class Module extends \dektrium\user\Module
{
    public $controllerMap = [
        'admin'    => 'dektrium\user\controllers\AdminController',
        'registration' => 'dektrium\user\controllers\RegistrationController',
        'security'     => 'app\modules\users\controllers\SecurityController',// Переопределенный контроллер
        'recovery'     => 'dektrium\user\controllers\RecoveryController',
        'settings'     => 'dektrium\user\controllers\SettingsController',
        'profile'      => 'dektrium\user\controllers\ProfileController',
    ];
}

В котором переопределил контроллер SecurityController на свой
namespace app\modules\users\controllers;

use dektrium\user\controllers\SecurityController as BaseSecurityController;

class SecurityController extends BaseSecurityController
{
    public function actionLogin()
    {
        $this->layout = 'main-login';
        return parent::actionLogin();
    }
}

В своем модуле переопределил основную вьюху, всю выводить не буду, только покажу проблемный участок.
<div class="row">
            <div class="col-xs-12">
                <?= Html::a(
                    Yii::t('user', 'Forgot password?'),
                    ['/user/recovery/request']
                ) ?>
            </div>
        </div>

Как видно, ссылка ведет на '/user/recovery/request', но при нажатии на ссылку попадаю на '/user/forgot', что приводит к 404 ошибке.
Как я понял это происходит по той причине, что у самого модуля dektrium/yii2-user прописано
public $urlRules = [
        '<id:\d+>'                               => 'profile/show',
        '<action:(login|logout|auth)>'           => 'security/<action>',
        '<action:(register|resend)>'             => 'registration/<action>',
        'confirm/<id:\d+>/<code:[A-Za-z0-9_-]+>' => 'registration/confirm',
        'forgot'                                 => 'recovery/request',// Тут правило которое меняет маршрут
        'recover/<id:\d+>/<code:[A-Za-z0-9_-]+>' => 'recovery/reset',
        'settings/<action:\w+>'                  => 'settings/<action>'
    ];

Теперь вопрос: как правильно исправить эту ситуацию, чтобы не возникала ошибка 404?
  • Вопрос задан
  • 1043 просмотра
Решения вопроса 1
proudmore
@proudmore
Вам в принципе не нужно наследовать модуль. Вы можете в controllerMap изменять контроллеры, используемые в модуле.
'user' => [
            'controllerMap' => [
                'recovery' => [
                    'class' => 'dektrium\user\controllers\RecoveryController',
                    'layout' => '@backend/views/layouts/main-login'
                ],
                'security' => [
                    'class' => 'dektrium\user\controllers\SecurityController',
                    'layout' => '@backend/views/layouts/main-login'
                ]
            ],
            'modelMap' => [
                'LoginForm' => 'backend\models\LoginForm',
            ],
        ]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Доброй ночи.
Переопределите правила url у себя в конфигурации или файле модуля.

UPD.
Если Вы хотите скрыть меню от не авторизованных пользователей, то необязательно переопределять представление.
Достаточно проверить, является вошедший на сайт гостем или нет.
if(!Yii::$app->user->isGuest){
    echo Nav::widget([
        // your code
    ])
}

Если хотите исключить из показа только некоторые пункты меню, то можно сделать так:
echo Nav::widget([
    'items' => array_filter([
        if(!Yii::$app->user->isGuest) :
          [ 'label' => 'выход']
         : false,
     ])
])

Правила urlManager можно сделать группой при помощи yii\web\GroupUrlRule
'rules' => [
    [
      'class' => 'yii\web\GroupUrlRule',
      'prefix' => 'admin',
      'routePrefix' => 'admin',
      'rules' => [
         '<_a:(login|logout)>' => 'user/users/<_a>',
      ],
    ],
    // правила не для модуля
]

Можно переопределить с самом файле модуля.

UPD.
В директории модуля создаёте файл ModuleBootstrap.
<?php
namespace app\modules\nameModule;
use yii\base\BootstrapInterface;

class ModuleBootstrap inplements BootstrapInterface{
  public function bootstrap($app)
  {
      $app->getUrlManager()->addRules([
          // rule declarations here
      ], false);
  }
}

Регистрируете этот файл в конфигурационном файле в секции bootstrap.
'bootstrap' => [
   'app\modules\nameModule\ModuleBootstrap'
]
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы