Maison  >  Article  >  cadre php  >  Utilisation du modèle de référentiel dans Laravel (mode entrepôt)

Utilisation du modèle de référentiel dans Laravel (mode entrepôt)

藏色散人
藏色散人avant
2021-02-01 11:04:012883parcourir
Ce qui suit est introduit par

Laravel La colonne tutoriel présentera à tout le monde l'utilisation du modèle de référentiel dans Laravel. J'espère que cela sera utile aux amis qui en ont besoin !

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 code

4 Réduire la probabilité d'erreurs de code

5 Améliorer considérablement la lisibilité du code du contrôleur

Comme indiqué dans l'image montre la relation hiérarchique du référentiel

Utilisation du modèle de référentiel dans Laravel (mode entrepôt)

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. . .


Modèle de référentiel (modèle d'entrepôt)

Bien que les modèles de conception n'aient rien à voir avec les langages et les frameworks, ils sont séparés à partir de langages et de frameworks, il nous est difficile de comprendre, donc nous l'apprenons toujours dans le contexte de Laravel.

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

Le deuxième est

, condition de fonctionnement des données whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)

Le troisième est

méthode d'acquisition de données get()

Nous savons qu'il y a un

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()

Le degré de simplification est lié au niveau d'abstraction de votre logique. Par exemple, vous pouvez écrire :

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

Dans les projets plus complexes,

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

Parlant. de découplage, nous avons mentionné dans le

guide du document que le premier artefact est l'interface en PHP (Laravel) Interface

Regardons l'exemple ci-dessous

La première étape consiste à créer un dossier

app
Repositories
Interfaces
Implements
Interfaces 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'interface

Cré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

Ouvrez

et 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ôt

Retournez à 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer