суббота, 19 декабря 2015 г.

Yii2-user: как убрать имя пользователя при регистрации

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

В статье пойдет речь о том, как "малой кровью" отказаться от необходимости регистрации с обязательным указанием имени пользователя на веб-сайте, созданном на Yii2 v2.0.6 (шаблон приложения advanced) с использованием стороннего модуля Yii2-user v0.9.5.

Почему "малой кровью"? Дело в том, что если имя пользователя выпиливать под чистую, то придется достаточно значительно переписать (переопределить) Yii2-user, чего делать не очень-то хочется.

Далее о том, какое в итоге решение у меня получилось.

Предполагается, что вы уже установили и настроили Yii2 (advanced) а так же Yii2-user.

Основная идея заключается в том, чтобы изменить поведение Yii2-user таким образом, чтобы он перестал ругаться на незаполненное поле имени пользователя при регистрации.

Для этого как минимум потребуется:

  1. Переопределить метод rules() в модели RegistrationForm.
  2. Переопределить метод rules() в модели User.
  3. Переопределить представление register.
  4. Создать и применить миграцию, делающую имя пользователя в базе необязательным полем.

1. Переопределение модели RegistrationForm.

Создадим файл RegistrationForm.php в директории, где лежат модели вашего приложения. Я сделал это в common/models:

namespace common\models;

use dektrium\user\models\RegistrationForm as BaseRegistrationForm;

class RegistrationForm extends BaseRegistrationForm
{
    public function rules()
    {
        $rules = parent::rules();
        
        unset($rules['usernameRequired']);
        $rules[] = ['username', 'default'];
        
        return $rules;
    }
}

В RegistrationForm мы переопределяем метод rules() таким образом, чтобы исключить из него правило валидации имени пользователя (username), которое делает его обязательным к заполнению, и добавить новое правило валидации, которое в случае незаполненного значения username присвоит ему значение NULL - как раз то, что нам нужно.

Теперь сообщим Yii2, чтобы вместо стандартной RegistrationForm в Yii2-user он использовал нашу созданную модель. Для этого подредактируем конфиг приложения common/config/main.php:

[...]
'modules' => [
 [...]
    'user' => [
        'class' => 'dektrium\user\Module',
        'modelMap' => [
            'RegistrationForm' => [
                'class' => 'common\models\RegistrationForm',
            ],
        ],
    ],
    [...]
],
[...]

2. Переопределение модели User.

Создадим файл User.php в директории, где лежат модели приложения. Так же как и ранее сделаем это в common/models:

namespace common\models;

use dektrium\user\models\User as BaseUser;

class User extends BaseUser
{
    public function rules()
    {
        $rules = parent::rules();
        
        unset($rules['usernameRequired']);
        $rules[] = ['username', 'default'];
        
        return $rules;
    }
}

Изменения в User аналогичны тому, что мы делали с моделью RegistrationForm.

Так же аналогичным образом сообщим Yii2 использовать нашу созданую модель User вместо стандартной в Yii2-user:

[...]
'modules' => [
 [...]
    'user' => [
        'class' => 'dektrium\user\Module',
        'modelMap' => [
            'RegistrationForm' => [
                'class' => 'common\models\RegistrationForm',
            ],
            'User' => [
                'class' => 'common\models\User',
            ],
        ],
    ],
    [...]
],
[...]

3. Переопредение представления register.

Создадим копию представление vendor/dektrium/yii2-user/views/registration/register.php например сделав это в директории common/views/dektrium/yii2-user/. Из него удалим строку, содержащую:

$form->field($model, 'username')

которая создает поле формы для ввода имени пользователя.

Сообщим Yii2 о том, что нужно использовать вместо стандартного наше модифицированное представление. Для этого подредактируем конфиг common/config/main.php:

[...]
'components' => [
    [...]
    'view' => [
        'theme' => [
            'pathMap' => [
                '@dektrium/user/views' => '@common/views/dektrium/yii2-user',
            ],
        ],
    ],
    [...]
],
[...]

4. Создание миграции для модификации БД.

По-умолчанию поле username не может быть пустым, а это нам не подходит. Создадим миграцию, для чего в корневом каталоге проекта выполним команду:

php yii migrate/create username_unrequired

После выполнения команды в директорию console/migrations/ упадет файлик, имя которого будет оканчиваться на _username_unrequired.php, внутри будет шаблон класса миграции, расширяемого от yii\db\Migration. Определим у этого класса следующие методы:

public function up()
{
    $this->alterColumn('{{%user}}', 'username', Schema::TYPE_STRING . '(255)');
}

public function down()
{
    $this->alterColumn('{{%user}}', 'username', Schema::TYPE_STRING . '(255) NOT NULL');
}

Теперь нужно применить миграцию. Сделать это можно командой:

php yii migrate

По большому счету на этом все. На сайте уже можно регистрироваться и логиниться без указания имени пользователя.

Комментариев нет:

Отправить комментарий