Почему не используется scenario?

Почему большинство Yii2 разработчиков не используют scenario для авторизации / регистрации пользователя, а вместо этого создают отдельные модели?

Так, например: тут реализована модель для авторизации, тут модель для регистрации, а это сама модель User. Так почему бы не объединить все в одну модель? К примеру, в модель User добавить в функцию rules что-то вроде:

public function rules()
{
    return [
        // SCENARIO ДЛЯ РЕГИСТРАЦИИ
        ['username', 'filter', 'filter' => 'trim', 'on' => self::SCENARIO_REGISTER],
        ['username', 'required', 'on' => self::SCENARIO_REGISTER],
        ['username', 'unique', 'targetClass' => User::class, 'message' => Yii::t('app', 'This username has already been taken.'), 'on' => self::SCENARIO_REGISTER],
        ['username', 'string', 'min' => 2, 'max' => 255, 'on' => self::SCENARIO_REGISTER],

        ['email', 'filter', 'filter' => 'trim', 'on' => self::SCENARIO_REGISTER],
        ['email', 'required', 'on' => self::SCENARIO_REGISTER],
        ['email', 'email', 'on' => self::SCENARIO_REGISTER],
        ['email', 'unique', 'targetClass' => User::class, 'message' => Yii::t('app', 'This email address has already been taken.'), 'on' => self::SCENARIO_REGISTER],

        ['password', 'required', 'on' => self::SCENARIO_REGISTER],
        ['password', 'string', 'min' => 6, 'on' => self::SCENARIO_REGISTER],
    ];


    // SCENARIO ДЛЯ АВТОРИЗАЦИИ
    [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
    ['password', 'validatePassword', 'on' => self::SCENARIO_LOGIN],
}

И таким образом, вместо создания двух новых моделей (для авторизации и регистрации), у нас весь код получится в одной модели User. Просто нужно будеть указывать какой scenario в данный момент используется. Разве так не правильнее?


Ответы (1 шт):

Автор решения: WinterSilence

Не стоит путать модель и форму - они служат разным целям. Для примера, у тебя есть форма входа в админку в которой кроме логина и пароля требуется ввести капчу. Правила проверки капчи не относятся непосредственно к модели User. Можно было бы использовать DynamicModel, но в сообществе Yii2 принято создавать класс формы наследуемой от Model.

Использовать модель для указания правил валидации формы - это плохое архитектурное решение т.к. твоя модель становится зависимой от этих форм : тебе придется каждый раз изменять модель при их изменении/удалении. Кроме того, как показано на примере с капчей, твоя модель будет содержать правила для полей которые не являются её атрибутами. Если еще не знаком, то почитай о SOLID принципах проектирования.

→ Ссылка