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 !
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.
Il vous aide à ajouter un comportement supplémentaire sur un objet sans affecter les autres objets de la même classe.
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
Disons que nous avons un modèle Post
class Post extends Model { public function scopePublished($query) { return $query->where('published_at', '<=', 'NOW()'); } }
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.
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 suivant
app/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); } }
现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProvider
rrreee
PostsRepository
app/Providers/AppServiceProvider.php
PostsRepositoryInterface
, Laravel créera une instance PostsRepository
et renvoie il. Mise en cache via les décorateurs
Ici, la mise en cache est le comportement et l'objet/classe estNous 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.
PostsRepository
. 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!