【问题标题】:Yii: Following strict MVC rules to ensure that all the business logic is in appropriate placesYii:遵循严格的 MVC 规则,确保所有业务逻辑都在适当的位置
【发布时间】:2012-11-01 13:11:13
【问题描述】:

在 Yii 中坚持 MVC 基础,我试图将我的业务规则嵌入到模型类中,但在实现它时遇到了问题。手头的问题是阻止用户创建重复条目并在模型类中编写函数来检查表中是否已经存在该条目。我想在我的模型类中编写一个方法来查询相同模型的基础表,如果新的业务实体存在,它只会返回 false。如果我在控制器中对此进行编码,我可以实现所需的功能,但我想将其保留在模型中,以便无论在何处使用模型,我都可以访问该方法并坚持 MVC 基础知识,它规定了瘦控制器和厚模型。提前致谢。

【问题讨论】:

    标签: php yii yii-cmodel


    【解决方案1】:

    最好的方法是避免(至少)直接在控制器中使用活动记录实例。

    您应该创建类似service 的结构,其中包含CActiveRecordCFormModel 实例之间的交互。这可以让您更好地将表示层(视图、控制器和模板)与模型层隔离开来。

    此类服务还能够保存(有时,对)它所使用的 CActiveRecordCFormModel 实例抛出的错误/异常。

    【讨论】:

      【解决方案2】:

      Cross-site Request Forgery Prevention 可能是您要找的?除非您的“重复条目”的想法与您的业务模型直接相关,在这种情况下,您可以覆盖 CActiveRecord.beforeSave() 并将您的逻辑放在那里,如果此方法返回 false,则不会将记录保存到数据库中。

      如果您使用 later 方法,并且希望将错误传递给视图并显示给用户,您始终可以使用 CModel.addError() 方法,在这种情况下是在您的 beforeSave 方法中。

      还有另一个选项,使用custom validators

      哪个更合适?取决于您的业务逻辑。

      【讨论】:

      • 谢谢,我让它按照我想要的方式工作。然而有一件事,我想得到我在 beforeSave 模型的方法中写的错误文本,以便我可以将它展示给最终用户。我这样做了: $error=$modelVar->save();但无法获取我的错误文本,而是将错误记录在 Yii 日志文件中。我正在执行 ajax 调用,需要按照我在 beforeSave 方法中提出错误文本的方式将错误文本返回给用户。任何线索?非常感谢您的支持。
      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2013-04-01
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多