在laravel中使用Repository Pattern(仓库模式)
Feb 01, 2021 am 11:04 AM下面由Laravel教程栏目给大家介绍在laravel中使用Repository Pattern(仓库模式),希望对需要的朋友有所帮助!
文章正文
Repository 模式主要思想是建立在一个数据操作代理层上的,把controller里的数据操作分离出来,这样做的好处有以下几点:
1 把数据处理逻辑分离使得代码更容易维护
2 数据处理逻辑和业务逻辑分离,可以对这两个代码分别进行测试
3 减少代码重复
4 降低代码出错的几率
5 让controller代码的可读性大大提高
如图所示Repository的分层关系
然而,要独立一个操作层出来,那就会增加大量代码,非常繁琐。如果你是小项目,未必需要使用这一模式。但如果是4-5年以上的复杂大型项目,这种模式的好处就比较明显了。
学习Repository Pattern的意义不只是为了使用它,更会让你深入思考框架的分层思想,你开始不仅关注怎么使用一个框架,还会想了解怎样设计一个框架,也许会成为你往高阶段编程的入口。当你感悟到什么是一种思想的时候。。。
Repository Pattern(仓库模式)
虽然说设计模式和语言及框架无关,但是脱离了语言及框架,我们很难理解,所以我们还是在laravel的语境下来学习。
1 2 3 4 5 6 7 8 9 |
|
以上是典型的Eloquent数据查询代码,如果你编程经验丰富,你会发现这种代码在控制器里到处都是,而且有很多是重复的,可读性很差;我们的目标是把它精简:
仔细观察
1 |
|
其实它由3部分组成.
第一是Post
数据模型;
第二个是whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
,数据操作条件;
第三个是get()
数据获取的方法;
我们知道,Eloquent
里有个Query Scope
,可以用来把第二部分,也就是查询条件精简。所以,在使用了Query Scope
后,我们可以把精简成:
1 |
|
咋一看上去,好像也没怎么精简啊,但实际上你已经实现代码解耦和复用了,比如说isDraft()
, 这个代码可以到处用,而不用担心耦合问题。
精简程度和你的逻辑抽象程度有关,比如说你完全可以写成:
1 |
|
在轻型项目中,强烈推荐使用Query Scope
,这是一种良好的编程习惯。
在更复杂的项目中,Query Scope
就不够用了,因为它和数据模型还是一种强耦合,Repository Pattern
就是要把第一,第二,第三部分全部解耦;
说到解耦,我们在Laravel
的文档攻略中讲过,第一神器就是PHP中的接口(Interface
)
下面来看例子
第一步 建立文件夹
1 2 3 4 |
|
Interfaces里面用来放接口,Implements用来放接口的实现;
第二步 建立一个接口
在上面的Interfaces
目录新建一个文件PostInterface.php
:
1 2 3 4 |
|
第三步 建立一个接口对应的实现
在上面的Implements
目录新建一个文件PostRepository.php
:
1 2 3 4 5 6 7 8 9 10 |
|
很明显,仓库指的就是一个仓库接口的实现;这里定义你的业务逻辑;
第四步 在ServiceProvider中绑定接口
打开app/Providers/AppServiceProvider
, 在register()
加入代码:
1 2 3 4 5 6 7 8 9 10 |
|
我们知道,ServiceProvider是Laravel IOC容器实现动态换接口实现的地方,所以我们在这里绑定一下,这样我们在使用的时候,不直接使用接口实现,而是用ioc容器解析接口,它会帮你自动找到对应好的实现。这就意味着,以后需要更换实现,可以在这里更换;
第五步 使用仓库
回到我们的controller里来
1 2 3 4 5 6 7 8 9 10 |
|
从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。
Atas ialah kandungan terperinci 在laravel中使用Repository Pattern(仓库模式). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP vs. Flutter: Pilihan terbaik untuk pembangunan mudah alih

Analisis kelebihan dan kekurangan alat ujian unit PHP

Bagaimana untuk menggunakan pemetaan hubungan objek (ORM) dalam PHP untuk memudahkan operasi pangkalan data?

Perbandingan versi terkini Laravel dan CodeIgniter

Seni bina dan amalan sistem teragih PHP

Bagaimanakah keupayaan pemprosesan data dalam Laravel dan CodeIgniter dibandingkan?

Ujian unit kod PHP dan ujian integrasi
