为什么要使用Repository
若将数据库逻辑都写在model,会造成model的肥大而难以维护,基于SOLID原则,我们应该使用Repository模式辅助model,将相关的数据库逻辑封装在不同的repository,方便中大型项目的维护
数据库逻辑
在CRUD中,CUD比较稳定,但R的部分则千变万化,大部分的数据库逻辑都在描述R的部分,若将数据库逻辑写在controller或model都不适当,会造成controller与model肥大,造成日后难以维护。
Model
使用repository之后,model仅当成Eloquent class即可,不要包含数据库逻辑,仅保留以下部分:
Property:如$table,$fillable…等。
Mutator:包括mutator与accessor。
Method:relation类的method,如使用hasMany()与belongsTo()。
注释:因为Eloquent会根据数据库字段动态产生property与method,等。若使用Laravel IDE Helper,会直接在model加上@property与@method描述model的动态property与method。
在中大型项目,会有几个问题:
将数据库逻辑写在controller,造成controller的肥大难以维护。
违反SOLID的单一职责原则:数据库逻辑不应该写在controller。
controller直接相依于model,使得我们无法对controller做单元测试。
比较好的方式是使用repository:
将model依赖注入到repository。
将数据库逻辑写在repository。
将repository依赖注入到service。