Yii: Следование строгим правилам MVC, чтобы убедиться, что вся бизнес-логика находится в соответствующих местах.

Придерживаясь основ MVC в Yii, я пытаюсь внедрить свои бизнес-правила в класс модели, но столкнулся с проблемой при его реализации. Проблема заключается в том, чтобы запретить пользователю создавать повторяющиеся записи и закодировать функцию в классе модели, которая проверяет, существует ли уже запись в таблице. Я хочу написать метод в своем классе модели, который будет запрашивать базовую таблицу той же модели, и если новый бизнес-объект существует, он просто возвращает false. Если я закодирую это в контроллере, я смогу добиться желаемой функциональности, но я хочу сохранить это в модели, чтобы, где бы она ни использовалась, я мог получить доступ к методу, а также придерживаться основ MVC, которые диктуют тонкие контроллеры и толстые модели. Заранее спасибо.


person FaisalKhan    schedule 01.11.2012    source источник


Ответы (2)


Предотвращение подделки межсайтовых запросов может быть то, что вы ищете? если ваше представление о «дублированных записях» не имеет прямого отношения к вашей бизнес-модели, в этом случае вы можете переопределить CActiveRecord.beforeSave() и поместите туда свою логику, если этот метод вернет false, запись не будет сохранена в базе данных.

Если вы используете более поздний метод и хотите передать ошибку в представление и отобразить пользователю, вы всегда можете использовать CModel.addError(), в данном случае в методе beforeSave.

Однако есть еще один вариант, который использует пользовательские валидаторы. .

что больше подходит? зависит от вашей бизнес-логики.

person Asgaroth    schedule 01.11.2012
comment
Спасибо, у меня получилось так, как я хотел. Однако одна вещь: я хочу получить текст ошибки, который я написал в методе модуля перед сохранением, чтобы я мог показать его конечному пользователю. Я сделал так: $error=$modelVar-›save(); но не смог получить свой текст ошибки, вместо этого ошибка регистрируется в файле журнала Yii. Я делаю вызов ajax и должен вернуть текст ошибки пользователю так, как я поднимаю его в методе beforeSave. любые подсказки? Большое спасибо за вашу поддержку. - person FaisalKhan; 01.11.2012

Лучшим способом было бы избежать использования активных экземпляров записей (по крайней мере) непосредственно в контроллере.

Вместо этого вам следует создать структуры, подобные службе, которые обеспечивают взаимодействие между вашим CActiveRecord и CFormModel экземпляров. Это позволит вам лучше изолировать уровень представления (представления, контроллеры и шаблоны) от уровня модели.

Такие сервисы также могут удерживать (а иногда и реагировать на) ошибки/исключения, созданные экземплярами CActiveRecord и CFormModel, которые он использует.

person tereško    schedule 01.11.2012