튜토리얼 칼럼에서 소개한 내용입니다. 필요한 친구들에게 도움이 되길 바랍니다!
기사 텍스트리포지토리 모델의 주요 아이디어는 컨트롤러에서 데이터 작업을 분리하는 데이터 작업 에이전트 계층을 기반으로 구축하는 것입니다. 1. 데이터 처리 로직을 분리하면 코드 유지 관리가 더 쉬워집니다
2 데이터 처리 로직과 비즈니스 로직이 분리되어 두 코드를 별도로 테스트할 수 있습니다
3 코드 중복 감소
4 코드 오류 가능성 감소
5 컨트롤러 코드 가독성을 대폭 향상
그림과 같이 Repository의 계층적 관계그러나 독립적인 작업 레이어를 원할 경우 코드가 많이 추가되므로 매우 까다롭습니다. 번거롭다. 소규모 프로젝트의 경우 이 모드를 사용할 필요가 없을 수도 있습니다. 하지만 4~5년 이상 지속되는 복잡하고 대규모 프로젝트라면 이 모델의 이점은 더욱 분명해집니다.
Repository Pattern을 배우는 것의 의의는 단지 그것을 사용하는 것이 아니라 프레임워크의 계층적 사고에 대해 깊이 생각하게 한다는 것입니다. 프레임워크를 사용하는 방법에 관심을 갖게 될 뿐만 아니라 알고 싶어지게 됩니다. 더 높은 단계로 나아갈 수 있는 프레임워크를 설계하는 방법. 생각이 무엇인지 깨달을 때. . .
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'));}위 내용은 일반적인 Eloquent 데이터 쿼리 코드입니다. 프로그래밍 경험이 풍부하다면 이러한 종류의 코드가 컨트롤러의 모든 곳에 있고 반복되고 가독성이 좋지 않다는 것을 알게 될 것입니다. 간소화되었습니다.
자세히 살펴보세요
Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();
사실 3부분으로 구성되어 있습니다.
첫 번째는 Post
데이터 모델입니다.
두 번째는 whereIn('category_id', [1 ,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
, 데이터 작업 조건
세 번째; 하나는 get()
데이터 획득 방법입니다. Post
数据模型;
第二个是whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
,数据操作条件;
第三个是get()
数据获取的方法;
我们知道,Eloquent
里有个Query Scope
,可以用来把第二部分,也就是查询条件精简。所以,在使用了Query Scope
后,我们可以把精简成:
Post::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();
咋一看上去,好像也没怎么精简啊,但实际上你已经实现代码解耦和复用了,比如说isDraft()
, 这个代码可以到处用,而不用担心耦合问题。
精简程度和你的逻辑抽象程度有关,比如说你完全可以写成:
Post::findPosts([1,2],0,'desc',5)->get();
在轻型项目中,强烈推荐使用Query Scope
,这是一种良好的编程习惯。
在更复杂的项目中,Query Scope
就不够用了,因为它和数据模型还是一种强耦合,Repository Pattern
就是要把第一,第二,第三部分全部解耦;
说到解耦,我们在Laravel
的文档攻略中讲过,第一神器就是PHP中的接口(Interface
)
下面来看例子
第一步 建立文件夹
app Repositories Interfaces Implements
第二步 建立一个接口
在上面的目录新建一个文件
PostInterface.php
:
namespace App\Repositories\Interfaces;Interface PostInterface{ public function findPosts(Array $cat_id,$is_draft,$order,$take) { }}
第三步 建立一个接口对应的实现
在上面的Implements
目录新建一个文件PostRepository.php
:
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; }}
很明显,仓库指的就是一个仓库接口的实现;这里定义你的业务逻辑;
第四步 在ServiceProvider中绑定接口
打开app/Providers/AppServiceProvider
, 在register()
Eloquent
에 Query Scope
가 있다는 것을 알고 있습니다. 두 번째 부분은 쿼리 조건이 단순화되었습니다. 따라서 쿼리 범위
를 사용하면 다음과 같이 단순화할 수 있습니다.
<?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'); }}얼핏 보기에는 그다지 간소화되지 않은 것처럼 보이지만 실제로는 다음과 같은 코드 분리 및 재사용을 달성했습니다.
isDraft()
, 이 코드는 결합 문제에 대한 걱정 없이 어디에서나 사용할 수 있습니다. 단순화 정도는 논리의 추상화 수준과 관련이 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다.
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); }}라이트 프로젝트에서는
쿼리 범위
를 사용하는 것이 좋습니다. 좋은 프로그래밍 습관. 🎜🎜더 복잡한 프로젝트에서는 쿼리 범위
가 여전히 데이터 모델과 강력하게 결합되어 있기 때문에 충분하지 않습니다. 리포지토리 패턴
은 첫 번째와 두 번째, 세 번째를 만드는 것입니다. 🎜🎜디커플링에 대해 말하자면, Laravel
의 문서 가이드에서 첫 번째 아티팩트는 PHP의 인터페이스(인터페이스
)라고 언급했습니다.🎜🎜🎜 살펴보겠습니다. 예에서🎜🎜🎜첫 번째 단계는 폴더를 만드는 것입니다🎜rrreee🎜Interfaces는 인터페이스를 넣는 데 사용되며 Implements는 인터페이스 구현을 넣는 데 사용됩니다.🎜🎜두 번째 단계는 인터페이스를 만드는 것🎜🎜In 위의 >Interfaces
디렉터리에 새 파일을 만듭니다. PostInterface.php
:🎜rrreee🎜세 번째 단계는 인터페이스에 해당하는 구현을 만드는 것입니다🎜🎜새 파일 만들기 위의 Implements
디렉터리 PostRepository.php
:🎜rrreee🎜분명히 웨어하우스는 웨어하우스 인터페이스의 구현을 의미합니다. 여기서 비즈니스 로직을 정의하세요.🎜🎜4단계: 바인딩 ServiceProvider🎜🎜의 인터페이스 app/Providers/AppServiceProvider
를 열고 register()
에 코드를 추가하세요. 🎜rrreee🎜ServiceProvider는 Laravel IOC 컨테이너가 동적 인터페이스를 구현하는 곳이라는 것을 알고 있습니다. 대체하므로 여기에 바인딩합니다. 이런 방식으로 사용할 때 인터페이스 구현을 직접 사용하지 않고 ioc 컨테이너를 사용하여 인터페이스를 구문 분석하면 자동으로 해당 구현을 찾습니다. 즉, 나중에 구현을 변경해야 하는 경우 여기에서 변경할 수 있습니다. 🎜🎜5단계 창고 사용🎜🎜컨트롤러로 돌아가기🎜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); }}
从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。
위 내용은 laravel에서 리포지토리 패턴 사용(웨어하우스 모드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!