关于lumen的repository概要
目录
repository
在项目业务逐渐庞大,业务数据进一步抽象后,很需要一个所谓的数据源repo用来提供给业务逻辑层获取或更新数据,而repo负责查询与更新数据,至于repo找哪个model实现数据查询与更新,业务逻辑层其实不要去操心和关心,只需要对接repo就可以,就像当时业务不那么庞大时,业务逻辑层会直接找各自的model实现数据的查询与更新,现在直接通过repo来解耦业务逻辑与model。
有很多人强烈建议上repository,andersao/l5-repository: Laravel 5 - Repositories to abstract the database layer也很详细介绍了repository作为数据抽象层的使用方式,这边以中文当时概要记录,方便快速浏览。
repository对model的抽象,主要做了什么
- 通用DQL、DML封装
- 查询
- 获取所有记录
- 支持id获取记录
- 分页获取记录(建议id或索引field游标获取下一页的方式)
- 支持指定field获取记录(建议索引)
- 支持多条件查询(and条件)
- 比较(支持date日期的比较)
- in、not in
- between
- 支持whereIn、whereBetween、whereNotIn
- 支持过滤隐藏敏感field
- 支持白名单field
- 支持model关联查询
- limit => take
- 支持自定scope
- 排序sortBy
- 插入create
- 更新update
- 只支持通过id更新
- 支持updateOrCreate
- 删除
- 支持通过id删除
- 支持通过更多条件删除
- 查询
- 支持标准查询条件criteria
- request crireria(相当于repository层定义好读取解析url的规则,直接generate对应model方法并执行,类似于jqgrid+tp的model抽象层)
- 支持cache层(比如可以开启配置,也可以在repository单独配置)
- 支持validator验证器
- 支持presenter输出自定义(比如格式或是filed调整等)
- transform定义
小结
- 支持大部分model操作,对于项目需要特殊的查询可以根据实际情况封装
- 作为model的一个小抽象层,能提高开发效率,避免低级的sql问题
- 验证器可以进一步控制数据的入库,但这里验证器原先的目的是担心input数据直接写入model
- presenter中的transform可以把控数据统一输出,避免model数据随便下发给客户端。
- 很多项目并没有真正使用到model,仍然在array或是基础object层面上操作数据集,建议充分理解model的定义的数据结构与使用方式,再推广使用
- 其实项目没有大到需要这么高层的抽象,或者说业务数据并不需要抽象出一个数据源repo,repo去使用不同的model要数据时,大可直接使用model。
建议逐渐使用。