Какие минусы прописать все правила полей в AR модели Yii2?

Какие задачи решаю:
1. Проверка валидности данных перед сохранением в БД, неважно от юзера получили или криворукий программист собрал модель -надо проверить данные перед сохранением. Проверяем только поля что идут в БД, для всего остального используем модель форм которая должна собрать основную AR-модель чтоб она могла сохранится.

2. Не копи-пастить логику по разным моделям форм. Есть AR-модель Юзер, у него есть пароль, теперь правила пароля: форма регистрации, форма входа, форма смены пароля после восстановления, смена пароля в кабинете, смена пароля в админке (свой пароль), смена пароля в админке другого юзера и т.д. кучу кучу форм где идет копипаст правил. И теперь что делать если поставили задачу увеличить миним. кол-во символов в пароле или поставить еще проверку на сложность пароля?

Как я вижу решение:
1. БД не содержит никакой логики, тупо черный ящик, но модель перед ней решает все (последняя инстанция, отступать некуда позади... БД)
2. AR-модель самая тяжелая
2.1 содержит все правила по всем(!) полям БД. Защита от дураков и кривых рук, не сохраняется пока все по уму не сделаешь.
2.2 метод сценариев переписан так, что все поля небезопасны для load(). Контроллер говорит модели с какими полями можно работать, либо модель формы (наследница AR-модели) говорит с какими полями она работает. и только тогда load() работает
2.3 при save() запускаются валидаторы только для полей что были обновлены

Так, один раз написав по уму модель, можно раскидать задачи с этой моделью на других разрабов, которые напишут разные формы, разные API и я буду более-менее уверен, что в БД будут целые, валидные данные. Не говоря о том, что завтра не нужно будет поиском выковыривать места, где идет проверка данных для этой модели (поставили задачу сделать необязательным какое-то поле или сделать float вместо int).
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
@AlexKuznec
Вроде как ActiveRecord и реализует всё это: проверка поступающих значений, сценарии для контроля, когда какие атрибуты могут быть изменены.
save(), кажется, тоже сохраняет только изменившиеся значения (можете покопаться в исходниках или документации, так как я в этом месте глубоко не копал).
Как образец, можете посмотреть реализацию регистрации и логинов (несколько форм и контроллеров) в приложении advanced.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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