vorgestellt, um die Verwendung des Repository-Musters in Laravel vorzustellen. Ich hoffe, es wird den Freunden in Not hilfreich sein!
ArtikeltextDie Hauptidee des Repository-Modells besteht darin, auf einer Datenoperationsagentenschicht aufzubauen, die die Datenoperationen im Controller trennt. Die Vorteile davon sind wie folgt: 1. Durch die Trennung der Datenverarbeitungslogik ist der Code einfacher zu warten
2 Datenverarbeitungslogik und Geschäftslogik sind getrennt, und die beiden Codes können separat getestet werden
3 Reduzieren Sie Codeduplizierungen
4 Reduzieren Sie die Wahrscheinlichkeit von Codefehlern
5 Machen Sie den Controller-Code besser lesbar. Verbessern Sie die hierarchische Beziehung des Repositorys erheblich, wie im Bild gezeigt. Wenn Sie jedoch eine unabhängige Betriebsschicht haben möchten, wird viel Code hinzugefügt, was sehr ist schwerfällig. Wenn Sie ein kleines Projekt haben, müssen Sie diesen Modus möglicherweise nicht verwenden. Wenn es sich jedoch um ein komplexes Großprojekt mit einer Laufzeit von mehr als 4 bis 5 Jahren handelt, liegen die Vorteile dieses Modells deutlicher auf der Hand.
Die Bedeutung des Erlernens des Repository-Musters besteht nicht nur darin, es zu verwenden, sondern auch darin, dass Sie intensiv über das mehrschichtige Denken des Frameworks nachdenken. Sie werden nicht nur darauf achten, wie ein Framework verwendet wird, sondern es auch wissen wollen wie man ein Framework entwirft, das Ihnen den Einstieg in die Programmierung erleichtern kann. Wenn dir klar wird, was ein Gedanke ist. . .
Repository-Muster (Warehouse-Muster)
Obwohl Designmuster nichts mit Sprache und Framework zu tun haben, ist es für uns ohne Sprache und Framework schwer zu verstehen, sodass wir es immer noch im Kontext von Laravel lernen.
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'));}
Das Obige ist ein typischer Eloquent-Datenabfragecode. Wenn Sie über umfangreiche Programmiererfahrung verfügen, werden Sie feststellen, dass sich dieser Code überall im Controller befindet und unser Ziel darin besteht, sich zu wiederholen Es ist vereinfacht:
Schauen Sie genau hin
Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();
Post
-Datenmodell; Der zweite ist whereIn('category_id', [1 ,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
, Datenoperationsbedingungen;
get()
. Wir wissen, dass es in Eloquent
einen Abfragebereich
gibt, der zum Hinzufügen verwendet werden kann zweiter Teil. Die Abfragebedingungen werden vereinfacht. Nachdem wir Query Scope
verwendet haben, können wir es also wie folgt vereinfachen:
Post::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();
isDraft()
, dieser Code kann überall verwendet werden, ohne sich Gedanken über Kopplungsprobleme machen zu müssen. Der Grad der Vereinfachung hängt vom Abstraktionsgrad Ihrer Logik ab. Sie können beispielsweise schreiben:
Post::findPosts([1,2],0,'desc',5)->get();
Query Scope
zu verwenden gute Programmiergewohnheiten. Post
数据模型;
第二个是whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
,数据操作条件;
第三个是get()
数据获取的方法;
我们知道,Eloquent
里有个Query Scope
,可以用来把第二部分,也就是查询条件精简。所以,在使用了Query Scope
后,我们可以把精简成:
app Repositories Interfaces Implements
咋一看上去,好像也没怎么精简啊,但实际上你已经实现代码解耦和复用了,比如说isDraft()
, 这个代码可以到处用,而不用担心耦合问题。
精简程度和你的逻辑抽象程度有关,比如说你完全可以写成:
namespace App\Repositories\Interfaces;Interface PostInterface{ public function findPosts(Array $cat_id,$is_draft,$order,$take) { }}
在轻型项目中,强烈推荐使用Query Scope
,这是一种良好的编程习惯。
在更复杂的项目中,Query Scope
就不够用了,因为它和数据模型还是一种强耦合,Repository Pattern
就是要把第一,第二,第三部分全部解耦;
说到解耦,我们在Laravel
的文档攻略中讲过,第一神器就是PHP中的接口(Interface
)
下面来看例子
第一步 建立文件夹
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; }}
Interfaces里面用来放接口,Implements用来放接口的实现;
第二步 建立一个接口
在上面的Interfaces
目录新建一个文件PostInterface.php
:
<?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'); }}
第三步 建立一个接口对应的实现
在上面的Implements
目录新建一个文件PostRepository.php
:
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); }}
很明显,仓库指的就是一个仓库接口的实现;这里定义你的业务逻辑;
第四步 在ServiceProvider中绑定接口
打开app/Providers/AppServiceProvider
, 在register()
In komplexeren Projekten reicht Query Scope
nicht aus, da es immer noch stark mit dem Datenmodell Repository Pattern
gekoppelt ist, um das erste und zweite, das dritte zu erstellen Ein Teil ist vollständig entkoppelt.
Apropos Entkopplung: Wir haben im Dokumentationsleitfaden von Laravel
erwähnt, dass das erste Artefakt die Schnittstelle in PHP ist (Interface
).
Erstellen Sie eine neue Datei im >Interfaces
-Verzeichnis PostInterface.php
:🎜rrreee🎜Der dritte Schritt besteht darin, eine der Schnittstelle entsprechende Implementierung zu erstellen🎜🎜Erstellen Sie eine neue Datei im obigen Implementiert
-Verzeichnis PostRepository.php
:🎜rrreee🎜Warehouse bezieht sich hier natürlich auf die Implementierung einer Warehouse-Schnittstelle; 🎜🎜Schritt 4: Binden die Schnittstelle in ServiceProvider🎜🎜Öffnen Sie app/Providers/AppServiceProvider
, fügen Sie Code in register()
hinzu: 🎜rrreee🎜Wir wissen, dass ServiceProvider der Ort ist, an dem der Laravel IOC-Container die dynamische Schnittstelle implementiert Ersetzen, also binden wir es hier. Auf diese Weise verwenden wir bei seiner Verwendung nicht direkt die Schnittstellenimplementierung, sondern verwenden den IOC-Container zum Parsen der Schnittstelle, wodurch automatisch die entsprechende Implementierung für Sie gefunden wird. Das heißt, wenn Sie die Implementierung in Zukunft ändern müssen, können Sie sie hier ändern. 🎜🎜Schritt 5: Verwenden Sie das Lager🎜🎜Zurück zu unserem Controller🎜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); }}
从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。
Das obige ist der detaillierte Inhalt vonVerwenden des Repository-Musters (Warehouse-Modus) in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!