Почему не используется 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 шт):
Не стоит путать модель и форму - они служат разным целям. Для примера, у тебя есть форма входа в админку в которой кроме логина и пароля требуется ввести капчу. Правила проверки капчи не относятся непосредственно к модели User. Можно было бы использовать DynamicModel, но в сообществе Yii2 принято создавать класс формы наследуемой от Model.
Использовать модель для указания правил валидации формы - это плохое архитектурное решение т.к. твоя модель становится зависимой от этих форм : тебе придется каждый раз изменять модель при их изменении/удалении. Кроме того, как показано на примере с капчей, твоя модель будет содержать правила для полей которые не являются её атрибутами. Если еще не знаком, то почитай о SOLID принципах проектирования.