坚持Yii中的MVC基础知识,我试图将我的业务规则嵌入模型类中,但在实现它时面临问题。手头的问题是阻止用户进行重复输入并在模型类中编写函数来检查表中是否已存在该条目。我想在我的模型类中编写一个方法来查询相同模型的基础表,如果新的业务实体存在,它只返回false。如果我在控制器中对此进行编码,我可以实现所需的功能,但我希望将其保留在模型中,以便无论何时使用模型,我都可以访问该方法并坚持MVC基础知识,这些基础知识决定了瘦控制器和厚模型。提前谢谢。
答案 0 :(得分:1)
最好的方法是避免直接在控制器中使用活动记录实例(至少)。
相反,您应该创建service类似的结构,其中包含CActiveRecord
和CFormModel
实例之间的互动。这样可以让您更好地将表示层(视图,控制器和模板)与模型层隔离开来。
此类服务还可以保留(有时会对其使用的CActiveRecord
和CFormModel
实例引发的错误/异常进行反应。
答案 1 :(得分:0)
Cross-site Request Forgery Prevention可能正是您要找的?除非您对“重复条目”的想法与您的业务模型直接相关,在这种情况下您可以覆盖CActiveRecord.beforeSave()并将逻辑放在那里,如果此方法返回false,则记录将不会保存到数据库中。
如果您使用更高版本的方法,并且想要将错误传递给视图并显示给用户,则可以始终使用CModel.addError()方法,在本例中为beforeSave方法。
还有另一种选择,即使用custom validators。
哪个更合适?取决于您的业务逻辑。