2015-06-10 17:56:50 2725次浏览 1条回答 0 悬赏 0 金钱

我建了一个

UserModel.php //用于存储各个表单的公共字段和规则等  
LoginForm extends UserModel //用于处理登录的逻辑和一些login独立有的字段  
SignupForm extends UserModel //用于处理注册逻辑和一些Singup才有的字段,比如确认密码 surepass 
UpdateForm extends UserModel //用户处理更新逻辑和更新才有的字段  
//Usermodel 中有个成员变量保存这User extends ActiveRecord的引用用于真正的curd  

现在的问题就是:
1 为什么要分离出规则和逻辑从UserModel呢?因为我考虑到 doc中 说不要在一个模型中过多的使用 场景scenario
(其实过多使用场景是会降低效率的 且 老是要手动指定scenario ),所以我采取这种做法,
但是明显觉得这样有点烦(虽然我将他们放在一个目录下了)或者有没有必要,或者有没有更好的做法。

2 不知道为什么?我就是不想要直接 一个Model extends ActiveRecord,所以在上面中
我定义了 UserModel extends ModelUser extends ActiveRecord
大家觉得这里有没有必要直接 继承ActiveRcord

  • 回答于 2015-06-12 22:03 举报

    ActiveRecord-》BaseActiveRecord-》Model
    这是一个继承关系,就是说ActiveRecord是Model的子级,model层的两种区别就不赘述了。

    UserModel.php //用于存储各个表单的公共字段和规则等  
    LoginForm extends UserModel //用于处理登录的逻辑和一些login独立有的字段  
    SignupForm extends UserModel //用于处理注册逻辑和一些Singup才有的字段,比如确认密码 surepass 
    UpdateForm extends UserModel //用户处理更新逻辑和更新才有的字段  
    //Usermodel 中有个成员变量保存这User extends ActiveRecord的引用用于真正的curd  
    

    这样做呢确实有他的好处,比如可以自己定义一些规则啊,都是专项的,考虑下扩展挺好的。
    对于场景机制,还是不错的,既然说效率低了些,那就慎用。

    个人从项目的扩展来看,分开的好。比如UpdateForm,这个可以将全站所有关于update相关的东东都可以写在一起了。
    管理起来会方便很多。
    要看就看整体的规划,这个有待衡量。
    程序越复杂,各个类的关系就会很复杂,是能分开就分开。算是一条开发原则了。
    若有不妥之处,还望指出!

    1 条回复
    回复于 2015-06-24 02:34 回复

    模型直接继承ActiveRecord的弊端就是在视图层中,开发者可以直接和数据库交互,从这点出发,可以考虑不继承ActiveRecord

    ———————无耻的分割线———————————————————————————————————————————————————————————————

    后面我在写的时候还是使用了UserModel继承ActiveRecord的方式,当然各个表单还是像上面分开,
    为什么我后来还是让UserModel继承了ActiveRecord,因为我发现,我的数据验证规则是分散在一个一个的FormModel
    中的,所以当return static::find()->where(['id'=>$id])->one()->validate()做更新的时候没有利用到数据规则,所以继承了,
    在controler中的代码就变成了 UpdateForm::findOnePost($id);了,暂时没有想到好的解决方法,不知道是不是旁落了
    scenario ,在项目中我还是没用到这个scenario 啊!(感觉要发生问题了),据我所知在,在事务中的使用好像也用到了
    scenario 这个,不知您有什么建议或实践,
    非常感谢您的回答,在我独自学习yii2的过程中。

您需要登录后才可以回答。登录 | 立即注册
jackz
主管

jackz

注册时间:2015-06-10
最后登录:2018-08-02
在线时长:10小时6分
  • 粉丝6
  • 金钱255
  • 威望30
  • 积分655

热门问题