Rumah rangka kerja php Laravel 在laravel中使用Repository Pattern(仓库模式)

在laravel中使用Repository Pattern(仓库模式)

Feb 01, 2021 am 11:04 AM
laravel

下面由Laravel教程栏目给大家介绍在laravel中使用Repository Pattern(仓库模式),希望对需要的朋友有所帮助!

文章正文

Repository 模式主要思想是建立在一个数据操作代理层上的,把controller里的数据操作分离出来,这样做的好处有以下几点:

1 把数据处理逻辑分离使得代码更容易维护

2 数据处理逻辑和业务逻辑分离,可以对这两个代码分别进行测试

3 减少代码重复

4 降低代码出错的几率

5 让controller代码的可读性大大提高

如图所示Repository的分层关系

e891f0784a5c8897f0ba6f745cc7510.png

然而,要独立一个操作层出来,那就会增加大量代码,非常繁琐。如果你是小项目,未必需要使用这一模式。但如果是4-5年以上的复杂大型项目,这种模式的好处就比较明显了。

学习Repository Pattern的意义不只是为了使用它,更会让你深入思考框架的分层思想,你开始不仅关注怎么使用一个框架,还会想了解怎样设计一个框架,也许会成为你往高阶段编程的入口。当你感悟到什么是一种思想的时候。。。

Repository Pattern(仓库模式)

虽然说设计模式和语言及框架无关,但是脱离了语言及框架,我们很难理解,所以我们还是在laravel的语境下来学习。

1

2

3

4

5

6

7

8

9

public function index(){

 

    $posts = Post::whereIn('category_id',[1,2])

        ->where('is_draft',0)

        ->orderBy('created_at''desc')

        ->take(5)

        ->get();

 

    return view('front.index',compact('posts'));}

Salin selepas log masuk

以上是典型的Eloquent数据查询代码,如果你编程经验丰富,你会发现这种代码在控制器里到处都是,而且有很多是重复的,可读性很差;我们的目标是把它精简:

仔细观察

1

Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at''desc')->take(5)->get();

Salin selepas log masuk

其实它由3部分组成.

第一是Post数据模型;

第二个是whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5),数据操作条件;

第三个是get()数据获取的方法;

我们知道,Eloquent里有个Query Scope,可以用来把第二部分,也就是查询条件精简。所以,在使用了Query Scope后,我们可以把精简成:

1

Post::ofCategory([1,2])->isDraft()->orderBy('created_at''desc')->take(5)->get();

Salin selepas log masuk

咋一看上去,好像也没怎么精简啊,但实际上你已经实现代码解耦和复用了,比如说isDraft(), 这个代码可以到处用,而不用担心耦合问题。

精简程度和你的逻辑抽象程度有关,比如说你完全可以写成:

1

Post::findPosts([1,2],0,'desc',5)->get();

Salin selepas log masuk

在轻型项目中,强烈推荐使用Query Scope,这是一种良好的编程习惯。

在更复杂的项目中,Query Scope就不够用了,因为它和数据模型还是一种强耦合,Repository Pattern就是要把第一,第二,第三部分全部解耦;

说到解耦,我们在Laravel的文档攻略中讲过,第一神器就是PHP中的接口(Interface

下面来看例子

第一步 建立文件夹

1

2

3

4

app

Repositories

Interfaces

Implements

Salin selepas log masuk

Interfaces里面用来放接口,Implements用来放接口的实现;

第二步  建立一个接口

在上面的Interfaces目录新建一个文件PostInterface.php:

1

2

3

4

namespace App\Repositories\Interfaces;Interface PostInterface{   

    public function findPosts(Array $cat_id,$is_draft,$order,$take)   {

 

    }}

Salin selepas log masuk

第三步  建立一个接口对应的实现

在上面的Implements目录新建一个文件PostRepository.php:

1

2

3

4

5

6

7

8

9

10

namespace App\Repositories\Implements;use Post;class PostRepository Implements PostInterface{    

    public function findPosts(Array $cat_id,$is_draft,$order,$take){        

        $query = Post::whereIn('category_id',$cat_id)        

            ->where('is_draft',$is_draft)        

            ->orderBy('created_at'$order)        

            ->take($take)        

            ->get();        

 

        return $query;    

    }}

Salin selepas log masuk

很明显,仓库指的就是一个仓库接口的实现;这里定义你的业务逻辑;

第四步  在ServiceProvider中绑定接口

打开app/Providers/AppServiceProvider, 在register()加入代码:

1

2

3

4

5

6

7

8

9

10

<?php

namespace App\Providers;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{   

    public function boot(){

 

    }   

 

    public function register(){

 

        $this->app->bind('App\Repositories\Interfaces\PostInterface''App\Repositories\Implements\PostRepository');    

    }}

Salin selepas log masuk

我们知道,ServiceProvider是Laravel IOC容器实现动态换接口实现的地方,所以我们在这里绑定一下,这样我们在使用的时候,不直接使用接口实现,而是用ioc容器解析接口,它会帮你自动找到对应好的实现。这就意味着,以后需要更换实现,可以在这里更换;

第五步  使用仓库

回到我们的controller里来

1

2

3

4

5

6

7

8

9

10

use App\Repositories\Interfaces\PostInterface;class PostController extends BaseController{    

    public function __construct(PostInterface $post){ 

 

        $this->postRepo = $post;    

    }    

 

    public function index(){ 

 

        $this->postRepo->findPosts([1,2],0,'desc',5);    

    }}

Salin selepas log masuk

从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。

Atas ialah kandungan terperinci 在laravel中使用Repository Pattern(仓库模式). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP vs. Flutter: Pilihan terbaik untuk pembangunan mudah alih PHP vs. Flutter: Pilihan terbaik untuk pembangunan mudah alih May 06, 2024 pm 10:45 PM

PHP vs. Flutter: Pilihan terbaik untuk pembangunan mudah alih

Laravel - Perintah Artisan Laravel - Perintah Artisan Aug 27, 2024 am 10:51 AM

Laravel - Perintah Artisan

Analisis kelebihan dan kekurangan alat ujian unit PHP Analisis kelebihan dan kekurangan alat ujian unit PHP May 06, 2024 pm 10:51 PM

Analisis kelebihan dan kekurangan alat ujian unit PHP

Bagaimana untuk menggunakan pemetaan hubungan objek (ORM) dalam PHP untuk memudahkan operasi pangkalan data? Bagaimana untuk menggunakan pemetaan hubungan objek (ORM) dalam PHP untuk memudahkan operasi pangkalan data? May 07, 2024 am 08:39 AM

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

Perbandingan versi terkini Laravel dan CodeIgniter Perbandingan versi terkini Laravel dan CodeIgniter Jun 05, 2024 pm 05:29 PM

Perbandingan versi terkini Laravel dan CodeIgniter

Seni bina dan amalan sistem teragih PHP Seni bina dan amalan sistem teragih PHP May 04, 2024 am 10:33 AM

Seni bina dan amalan sistem teragih PHP

Bagaimanakah keupayaan pemprosesan data dalam Laravel dan CodeIgniter dibandingkan? Bagaimanakah keupayaan pemprosesan data dalam Laravel dan CodeIgniter dibandingkan? Jun 01, 2024 pm 01:34 PM

Bagaimanakah keupayaan pemprosesan data dalam Laravel dan CodeIgniter dibandingkan?

Ujian unit kod PHP dan ujian integrasi Ujian unit kod PHP dan ujian integrasi May 07, 2024 am 08:00 AM

Ujian unit kod PHP dan ujian integrasi

See all articles