Придерживаясь основ MVC в Yii, я пытаюсь внедрить свои бизнес-правила в класс модели, но столкнулся с проблемой при его реализации. Проблема заключается в том, чтобы запретить пользователю создавать повторяющиеся записи и закодировать функцию в классе модели, которая проверяет, существует ли уже запись в таблице. Я хочу написать метод в своем классе модели, который будет запрашивать базовую таблицу той же модели, и если новый бизнес-объект существует, он просто возвращает false. Если я закодирую это в контроллере, я смогу добиться желаемой функциональности, но я хочу сохранить это в модели, чтобы, где бы она ни использовалась, я мог получить доступ к методу, а также придерживаться основ MVC, которые диктуют тонкие контроллеры и толстые модели. Заранее спасибо.
Yii: Следование строгим правилам MVC, чтобы убедиться, что вся бизнес-логика находится в соответствующих местах.
Ответы (2)
Предотвращение подделки межсайтовых запросов может быть то, что вы ищете? если ваше представление о «дублированных записях» не имеет прямого отношения к вашей бизнес-модели, в этом случае вы можете переопределить CActiveRecord.beforeSave() и поместите туда свою логику, если этот метод вернет false, запись не будет сохранена в базе данных.
Если вы используете более поздний метод и хотите передать ошибку в представление и отобразить пользователю, вы всегда можете использовать CModel.addError(), в данном случае в методе beforeSave.
Однако есть еще один вариант, который использует пользовательские валидаторы. .
что больше подходит? зависит от вашей бизнес-логики.
Лучшим способом было бы избежать использования активных экземпляров записей (по крайней мере) непосредственно в контроллере.
Вместо этого вам следует создать структуры, подобные службе, которые обеспечивают взаимодействие между вашим CActiveRecord
и CFormModel
экземпляров. Это позволит вам лучше изолировать уровень представления (представления, контроллеры и шаблоны) от уровня модели.
Такие сервисы также могут удерживать (а иногда и реагировать на) ошибки/исключения, созданные экземплярами CActiveRecord
и CFormModel
, которые он использует.