search

Home  >  Q&A  >  body text

php - Yii2的model中应该包含哪些代码?

model中除了包含数据验证及基本的删除外,还能写哪些代码?如果要进行多行添加、删除、更新,数据预处理需要根据多种条件进行判断,同时要进行多个表的操作(并不存在一对多、多对一这样的关系),这里有很大一部分代码,写到controller中感觉很大,写在model感觉有时还不行,这些难道都写在helper里面,还是有其他好的地方来组织?

PHP中文网PHP中文网2819 days ago266

reply all(3)I'll reply

  • 高洛峰

    高洛峰2017-04-10 16:59:09

    凭感觉和经验吧,我的回答纯粹是抛砖。
    Yii2里面没有什么特别的model概念,包含文档和示例里面都很少提到这个东西,我感觉他们就是希望一切都用ActiveRecord对象(甚至form都是继承于此)就够用了,但是实际上这是很糟糕的事情,因为当多表联动的时候对象边界就会变得很模糊。然而实际上我在某个项目中自定义了model层后对方竟然还用这种写法不是Yii2推荐的为由拒付了项目尾款,所以我更是对此吐槽不已。
    在我看来,ActiveRecord对象是对数据表的映射,它应该只处理内部的事情,这无疑就清晰了很多。它就是数据表的实体映射,不是model。
    但是,很多时候多个表之间必然是联动的,如创建订单的时候必然要同时操作订单详情,那么这种逻辑控制应该是在model中完成。
    此外,如果Controller和ActiveRecord分别由不同的开发者完成时,model层也很重要,可以用于双方的耦合,因为允许在Controller中直接调用ActiveRecord实际上是挺危险的。

    至于你觉得Model不够用,还可以选择 Service, Plugin, Filter等,而不只仅限于Helper。

    补充:貌似还一直没扣题呢,哈哈
    我认为Model是在数据表基础上更为复杂的一种数据模型,往往表示了开发者对对象的理解与定义,例如我们有订单表和订单详情表,但是这不是对象级别的数据,而OrderModel则是对订单对象的声明,一个订单不但有订单信息,同时包含订单详情,甚至可能关联物流、发票等。
    我在Model中通常会包含
    常量定义,如果需要设置一些特定标示的话
    事物处理,如果需要多个ActiveRecord联动的话
    简单CRUD,如果需要隔离ActiveRecord的话,即约定Controller不去直接调用此类型的对象,而是必须通过model中封装的方法
    其它,我觉得Helper主要是给前端用的,所以一个方法常用但是前端不用,那么可以放在model里面;此外,有的方法可能不好确认其归属,即Amodel需要,Bmodel也需要,也简单,两处都声明,只不过一个是具体逻辑,另一个仅仅引用而已。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:59:09

    你可以使用行为(Behaviors).
    把模棱两可的共用代码 放在行为里。
    类似于Traits。

    或者组件。Components

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:59:09

    对象的数据属性和行为。

    reply
    0
  • Cancelreply