Texte de l'article
L'idée principale du modèle Repository est de s'appuyer sur une couche proxy d'opération de données, qui sépare les opérations de données dans le contrôleur. Les avantages de ceci sont les suivants : 1 La séparation de la logique de traitement des données facilite la maintenance du code. 2 La séparation de la logique de traitement des données et de la logique métier permet de tester les deux codes. séparément 3 Réduire la duplication de code4 Réduire la probabilité d'erreurs de code5 Améliorer considérablement la lisibilité du code du contrôleurComme indiqué dans l'image montre la relation hiérarchique du référentiel
Cependant, pour avoir une couche d'opération indépendante, cela ajoutera beaucoup de code, ce qui est très fastidieux. Si vous avez un petit projet, vous n'aurez peut-être pas besoin d'utiliser ce mode. Mais s’il s’agit d’un projet complexe et à grande échelle d’une durée de plus de 4 à 5 ans, les avantages de ce modèle sont plus évidents. L'importance de l'apprentissage du Repository Pattern n'est pas seulement de l'utiliser, mais aussi de vous faire réfléchir profondément à la superposition des frameworks. Vous commencerez non seulement à prêter attention à la façon d'utiliser un framework, mais vous souhaiterez également. pour savoir comment concevoir un framework. Peut-être deviendrez-vous votre point d'entrée vers la programmation avancée. Quand tu réalises ce qu’est une pensée. . .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'));}Ce qui précède est un code de requête de données Eloquent typique. Si vous avez une riche expérience en programmation, vous constaterez que ce type de code est partout dans le contrôleur, et qu'une grande partie est répétée et a une mauvaise lisibilité ; nous Le but est de le rationaliser : Regardez attentivement
Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();En fait, il se compose de 3 parties La première est le
modèle de données Post
, condition de fonctionnement des données whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)
méthode d'acquisition de données get()
dans Eloquent
; , qui peut Il est utilisé pour rationaliser la deuxième partie, qui concerne les conditions de requête. Ainsi, après avoir utilisé Query Scope
, nous pouvons le simplifier en : Query Scope
Post::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();À première vue, cela ne semble pas très simple, mais en fait vous avez réalisé le découplage et la réutilisation du code, comme Say
, ce code peut être utilisé partout sans se soucier des problèmes de couplage. isDraft()
Post::findPosts([1,2],0,'desc',5)->get();Dans les projets légers, il est fortement recommandé d'utiliser
, qui. est une bonne habitude de programmation. Query Scope
ne suffit pas car il est encore fortement couplé au modèle de données Query Scope
signifie découpler la première, la deuxième et la troisième partie ;Repository Pattern
guide du document que le premier artefact est l'interface en PHP (Laravel
) Interface
Regardons l'exemple ci-dessous
app Repositories Interfaces ImplementsInterfaces est utilisé pour mettre l'interface, et Implements est utilisé pour mettre l'implémentation de l'interface La deuxième étape consiste à créer une interface
Créez un nouveau fichier dans le répertoire
ci-dessus :Interfaces
namespace App\Repositories\Interfaces;Interface PostInterface{ public function findPosts(Array $cat_id,$is_draft,$order,$take) { }}
PostInterface.php
Étape 3 : Créez une implémentation correspondant à l'interfaceCréez un nouveau fichier dans le
🎜> répertoire au-dessus du fichier:Implements
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; }}
PostRepository.php
Évidemment, l'entrepôt fait référence à l'implémentation d'une interface d'entrepôt ; définissez ici votre logique métier Étape 4 : liez l'interface dans ServiceProvider
Ouvrezet ajoutez le code dans
:<?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'); }}
app/Providers/AppServiceProvider
Nous savons que ServiceProvider est l'endroit où le conteneur Laravel IOC implémente le changement d'interface dynamique, nous le lions donc ici afin d'utiliser When en utilisant l'interface, n'utilisez pas directement l'implémentation de l'interface, mais utilisez le conteneur ioc pour analyser l'interface, qui trouvera automatiquement l'implémentation correspondante pour vous. Cela signifie que si vous devez modifier l'implémentation à l'avenir, vous pouvez la modifier ici ;register()
Étape 5 : Utiliser l'entrepôtRetournez à notre contrôleur
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); }}
从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!