Maison  >  Article  >  cadre php  >  Parlons de la façon d'utiliser le modèle de décorateur de PHP dans Laravel

Parlons de la façon d'utiliser le modèle de décorateur de PHP dans Laravel

青灯夜游
青灯夜游avant
2022-09-20 11:12:352264parcourir

Comment utiliser le modèle décorateur de PHP dans Laravel ? L'article suivant vous présentera comment utiliser le modèle de décorateur PHP dans Laravel. J'espère qu'il vous sera utile !

Parlons de la façon d'utiliser le modèle de décorateur de PHP dans Laravel

Les modèles de conception sont importants pour chaque développeur. Il résout des problèmes très courants dans chaque projet que vous construisez.

Définition du motif décorateur :

Il vous aide à ajouter un comportement supplémentaire sur un objet sans affecter les autres objets de la même classe.

Wikipédia :

Le motif décorateur est un modèle de conception qui permet d'ajouter dynamiquement un comportement à un seul objet sans affecter le comportement des autres objets de la même classe

Question

Disons que nous avons un modèle Post

class Post extends Model
{
    public function scopePublished($query) {
        return $query->where('published_at', '<=&#39;, &#39;NOW()&#39;);
    }
}

Dans notre PostsController, nous avons la méthode d'indexation comme suit

class PostsController extends Controller
{
    public function index() {
        $posts = Post::published()->get();
        return $posts;
    }
}

Afin de mettre en cache les publications et d'éviter d'interroger la base de données à chaque fois que nous devons lister les publications, nous pouvons faire ce qui suit

class PostsController extends Controller
{
    public function index() {
        $minutes = 1440; # 1 day
        $posts = Cache::remember('posts', $minutes, function () {
            return Post::published()->get();
        });
        return $posts;
    }
}

Maintenant, nous mettons en cache les publications pendant 1 jour. Mais en regardant le code, le contrôleur en sait trop. Il sait combien de jours nous l'avons mis en cache, il met en cache l'objet lui-même.

De même, supposons que vous implémentiez la même fonctionnalité pour les balises, les catégories et les archives de HomePageController. C'est trop de code à lire et à maintenir.

Modèle de référentiel

Dans la plupart des cas, le modèle de référentiel est connecté au modèle de décorateur.

Tout d'abord, utilisons la séparation de modes warehouse pour obtenir des publications, créons app/Repositories/Posts/PostsRepositoryInterface.php avec le contenu suivantapp/Repositories/Posts/PostsRepositoryInterface.php

namespace App\Repositories\Posts;

interface PostsRepositoryInterface 
{

    public function get();

    public function find(int $id);

}

在同个目录下创建具有下面内容的 PostsRepository

namespace App\Repositories\Posts;

use App\Post;

class PostsRepository implements PostsRepositoryInterface
{
    protected $model;

    public function __construct(Post $model) {
        $this->model = $model;
    }

    public function get() {
        return $this->model->published()->get();
    }

    public function find(int $id) {
        return $this->model->published()->find($id);
    }

}

回到PostsController并将更改应用为

namespace App\Http\Controllers;

use App\Repositories\Posts\PostsRepositoryInterface;
use Illuminate\Http\Request;

class PostsController extends Controller
{
    public function index(PostsRepositoryInterface $postsRepo) {
        return $postsRepo->get();
    }
}

控制器变得健康,知道足够的细节来完成工作。

在这里,我们依靠 Laravel 的 IOC 注入 Posts 接口的具体对象来获取我们的帖子

我们需要做的就是告诉Laravel的IOC使用接口时要创建哪个类。

在你的 app/Providers/AppServiceProvider.php 添加绑定方法

namespace App\Providers;

use App\Repositories\Posts\PostsRepositoryInterface;
use App\Repositories\Posts\PostsRepository;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PostsRepositoryInterface::class,PostsRepository::class);
    }
}

现在无论何时我们注入PostsRepositoryInterface Laravel 都会创建 PostsRepository 的实例并将其返回。

通过装饰器实现缓存

我们在一开始就说过,装饰器模式允许将行为添加到单个对象,而不会影响同一类中的其他对象。

在这里缓存是行为,对象/类是 PostsRepository

让我们在 app/Repositories/Posts/PostsCacheRepository.php 中创建具有以下内容的PostsCacheRepository

namespace App\Repositories\Posts;

use App\Post;
use Illuminate\Cache\CacheManager;

class PostsCacheRepository implements PostsRepositoryInterface
{
    protected $repo;

    protected $cache;

    const TTL = 1440; # 1 day

    public function __construct(CacheManager $cache, PostsRepository $repo) {
        $this->repo = $repo;
        $this->cache = $cache;
    }

    public function get() {
        return $this->cache->remember('posts', self::TTL, function () {
            return $this->repo->get();
        });
    }

    public function find(int $id) {
        return $this->cache->remember('posts.'.$id, self::TTL, function () {
            return $this->repo->find($id);
        });
    }
}

在这个类中,我们接受 Caching 对象和 PostsRepository 对象,然后使用类(装饰器)将缓存行为添加到 PostsReposiory 实例。

我们可以使用相同的示例将HTTP请求发送到某些服务,然后在失败的情况下返回模型。我相信您会从该模式以及它是如何轻松添加行为中受益。

最后一件事是修改 AppServiceProvider 接口绑定以创建 PostsCacheRepository 实例而不是PostsRepository

namespace App\Providers;

use App\Repositories\Posts\PostsRepositoryInterface;
use App\Repositories\Posts\PostsCacheRepository;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PostsRepositoryInterface::class,PostsCacheRepository::class);
    }
}

现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProviderrrreee

Créez avec le contenu suivant dans le même répertoire Le PostsRepository

rrreee retourne au PostsController et applique les modifications à mesure que le contrôleur rrreee devient sain et connaît suffisamment de détails pour faire le travail.

Ici, nous nous appuyons sur l'IOC de Laravel pour injecter un objet spécifique de l'interface Posts afin d'obtenir nos publications
  • Tout ce que nous avons à faire est d'indiquer à l'IOC de Laravel quelle classe créer lors de l'utilisation de l'interface.
  • Ajoutez une méthode de liaison dans votre app/Providers/AppServiceProvider.php
  • rrreee
  • Maintenant, chaque fois que nous injectons PostsRepositoryInterface, Laravel créera une instance PostsRepository et renvoie il.

Mise en cache via les décorateurs

Nous avons dit au début que le modèle du décorateur permet d'ajouter un comportement à un seul objet sans affecter les autres objets de la même classe.

Ici, la mise en cache est le comportement et l'objet/classe est PostsRepository.

Créons PostsCacheRepository dans app/Repositories/Posts/PostsCacheRepository.php avec le contenu suivant rrreee

Dans cette classe, nous acceptons l'objet Caching et l'objet PostsRepository, puis utilisez une classe (décorateur) pour ajouter un comportement de mise en cache à l'instance PostsRepository. 🎜🎜Nous pouvons utiliser le même exemple pour envoyer une requête HTTP à un service puis renvoyer le modèle en cas d'échec. Je pense que vous bénéficierez de ce modèle et de la facilité avec laquelle il est possible d'ajouter un comportement. 🎜🎜La dernière chose est de modifier la liaison de l'interface AppServiceProvider pour créer une instance PostsCacheRepository au lieu d'un PostsRepository 🎜rrreee🎜 Vérifiez à nouveau le fichier et vous verrez qu'il est très facile à lire et à maintenir. De même, cela peut être testé si vous décidez de supprimer la couche de cache à un moment donné. Il vous suffit de modifier la liaison dans AppServiceProvider. Aucune modification supplémentaire n’est requise. 🎜🎜🎜🎜🎜 Conclusion 🎜🎜🎜🎜 Nous avons appris à mettre en cache des modèles à l'aide d'un modèle de décorateur 🎜🎜 Nous avons montré comment le modèle de référentiel se connecte au modèle de décorateur 🎜🎜 Comment l'injection de dépendances et Laravel IOC nous facilitent la vie 🎜🎜 Les composants Laravel sont puissants 🎜🎜 🎜 J'espère que vous avez apprécié la lecture de cet article. Il vous montre des modèles de conception puissants et comment rendre votre projet facile à entretenir et à gérer 🎜🎜🎜Adresse originale : https://dev.to/ahmedash95/design-patterns-in-php-decorator-with-laravel- 5hk6🎜🎜 🎜[Recommandations associées : 🎜tutoriel vidéo laravel🎜]🎜

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