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'));}
Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();
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();
, ce code peut être utilisé partout sans se soucier des problèmes de couplage. isDraft()
Post::findPosts([1,2],0,'desc',5)->get();
, 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 Implements
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!