@killary

Валидация в AR модели или в форме!?!?

Приветствую.
Задался следующим вопросом...
Есть AR модель и web админка в которой можно эту модель создать, изменить или удалить.
И есть несколько способов реализации:

1. Правила валидации описываем прям в AR модели. И эту же AR модель используем как модель формы.
Вроде бы все хорошо, но документация Yii да и сообщество, вроде как, твердят что валидация должна быть на уровне формы а не модели. Да и вообще желательно всегда использоваться формы.

2. Убираем валидацию из AR модели и делаем модели форм new и update. Валидацю делаем в моделях фом. Тоже все вроде бы хорошо, классический пример. Но, возникала проблема - у AR модели есть уникальное поле, и если на уровне AR модели его легко валидировать валидатором 'unique', то в модели формы нужен какой нибудь 'not exists' валидатор, но в Yii по каким то причинам такого нет. Значит либо свой делать, либо искать другие варианты.

3. Поэкспериментировать с чем то подобным - оставить валидацию на уровне AR модели. А модели форм наследовать от AR модели.

4. Еще один эксперимент - оставить валидацию на уровне AR модели, а в модели форм передавать ошибки валидации AR модели.

В общем все 4 варианта вроде бы рабочие, но со своими недостатками.
Но есть чуйка что должно быть какое то более стройное решение.

Поделитесь опытом, коллеги)
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
@werdender
Если ваша форма основана на AR-классе, то ее просто нужно от него унаследовать, переопределив, при необходимости, правила валидации и добавив нужную логику. Если нужно провалидировать данные, не связанные с БД (например форма входа), то то форма наследуется от yii\base\Model и правила валидации описываются в ней. Т.е. ответ на ваш вопрос зависит от того, какие данные вы валидируете.

Это общепринятый путь, который описан в документации к yii, но в реальном мире каждый ССЗБ:

Когда создаётся форма, основанная на модели, необходимо определить, что же является моделью. Модель может основываться на классе Active Record, который описывает некоторые данные из базы данных, или же на базовом классе Model (происходит от yii\base\Model), который позволяет использовать произвольный набор элементов формы (например, форма входа).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы