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