Heim > PHP-Framework > Laravel > Hauptteil

Lassen Sie uns darüber sprechen, wie Sie das Dekoratormuster von PHP in Laravel verwenden

青灯夜游
Freigeben: 2022-09-20 20:26:36
nach vorne
2357 Leute haben es durchsucht

Wie verwende ich das Dekoratormuster von PHP in Laravel? Der folgende Artikel stellt Ihnen vor, wie Sie den PHP-Decorator-Modus in Laravel verwenden. Ich hoffe, er wird Ihnen hilfreich sein!

Lassen Sie uns darüber sprechen, wie Sie das Dekoratormuster von PHP in Laravel verwenden

Designmuster sind für jeden Entwickler wichtig. Es löst sehr häufige Probleme in jedem Projekt, das Sie erstellen.

Definition des Dekoratormusters:

Es hilft Ihnen, einem Objekt zusätzliches Verhalten hinzuzufügen, ohne andere Objekte in derselben Klasse zu beeinflussen.

Wikipedia:

Das Dekoratormuster ist ein Entwurfsmuster, das es ermöglicht, einem einzelnen Objekt dynamisch Verhalten hinzuzufügen, ohne das Verhalten anderer Objekte in derselben Klasse zu beeinflussen

Frage

Nehmen wir an, wir haben ein Post-Modell

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

In unserem PostsController haben wir die Indexmethode wie folgt

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

Um die Beiträge zwischenzuspeichern und zu vermeiden, dass die Datenbank jedes Mal abgefragt wird, wenn wir die Beiträge auflisten müssen, können wir Folgendes tun

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

Jetzt zwischenspeichern wir Beiträge für einen Tag. Aber wenn man sich den Code ansieht, weiß der Controller zu viel. Es weiß, wie viele Tage wir es zwischengespeichert haben, es speichert das Objekt selbst zwischen.

Angenommen, Sie implementieren dieselbe Funktionalität für Tag, Kategorie und Archive von HomePageController. Das ist zu viel Code zum Lesen und Verwalten.

Repository-Muster

In den meisten Fällen ist das Repository-Muster mit dem Dekoratormuster verbunden. 🔜 Das PostsRepository

namespace App\Repositories\Posts;

interface PostsRepositoryInterface 
{

    public function get();

    public function find(int $id);

}
Nach dem Login kopieren

geht zurück zum PostsController und wendet die Änderungen an, sobald der

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);
    }

}
Nach dem Login kopieren
Controller fehlerfrei wird und über genügend Details verfügt, um die Aufgabe zu erledigen. app/Repositories/Posts/PostsRepositoryInterface.php

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();
    }
}
Nach dem Login kopieren

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

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);
    }
}
Nach dem Login kopieren

回到PostsController并将更改应用为

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);
        });
    }
}
Nach dem Login kopieren

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

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

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

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

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);
    }
}
Nach dem Login kopieren

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

通过装饰器实现缓存

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

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

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

rrreee

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

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

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

rrreee

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

Hier verlassen wir uns darauf, dass das IOC von Laravel ein bestimmtes Objekt der Posts-Schnittstelle einfügt, um unsere Beiträge zu erhalten.

Alles, was wir tun müssen, ist dem IOC von Laravel mitzuteilen, welche Klasse bei Verwendung der Schnittstelle erstellt werden soll. Fügen Sie eine Bindungsmethode in Ihrer app/Providers/AppServiceProvider.php hinzu. rrreee

Jetzt erstellt Laravel jedes Mal, wenn wir PostsRepositoryInterface injizieren, eine PostsRepository-Instanz und gibt sie zurück Es.
  • Caching über Dekoratoren
  • Wir sagten zu Beginn, dass das Dekoratormuster das Hinzufügen von Verhalten zu einem einzelnen Objekt ermöglicht, ohne andere Objekte in derselben Klasse zu beeinflussen.
Hier ist Caching das Verhalten und das Objekt/die Klasse ist PostsRepository.

Lassen Sie uns PostsCacheRepository in app/Repositories/Posts/PostsCacheRepository.php mit dem folgenden Inhalt erstellen
rrreee

In dieser Klasse akzeptieren wir Caching-Objekte und PostsRepository-Objekte und dann Verwenden Sie eine Klasse (Decorator), um der PostsRepository-Instanz Caching-Verhalten hinzuzufügen.

Wir können dasselbe Beispiel verwenden, um eine HTTP-Anfrage an einen Dienst zu senden und dann im Fehlerfall das Modell zurückzugeben. Ich glaube, dass Sie von diesem Muster und davon profitieren werden, wie einfach es ist, Verhalten hinzuzufügen.

Der letzte Schritt besteht darin, die AppServiceProvider-Schnittstellenbindung zu ändern, um eine PostsCacheRepository-Instanz anstelle eines PostsRepository zu erstellen. rrreee

Überprüfen Sie nun die Datei erneut und Sie werden feststellen, dass sie sehr einfach zu lesen und zu warten ist. Ebenso ist es testbar, wenn Sie sich irgendwann dazu entschließen, die Cache-Ebene zu entfernen. Sie müssen lediglich die Bindung in AppServiceProvider ändern. Es sind keine weiteren Änderungen erforderlich. 🎜🎜🎜🎜🎜 Fazit 🎜🎜🎜🎜 Wir haben gelernt, wie man Modelle mithilfe des Dekoratormusters zwischenspeichert 🎜🎜 Wir haben gezeigt, wie das Repository-Muster mit dem Dekoratormuster verbunden ist 🎜🎜 Wie Abhängigkeitsinjektion und Laravel IOC unser Leben einfacher machen 🎜🎜 Laravel-Komponenten sind leistungsstark 🎜🎜 🎜 Ich hoffe, dass Ihnen die Lektüre dieses Artikels gefallen hat. Es zeigt Ihnen leistungsstarke Designmuster und wie Sie die Wartung und Verwaltung Ihres Projekts vereinfachen 🎜🎜🎜Originaladresse: https://dev.to/ahmedash95/design-patterns-in-php-decorator-with-laravel- 5hk6🎜🎜 🎜[Verwandte Empfehlungen: 🎜Laravel-Video-Tutorial🎜]🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie Sie das Dekoratormuster von PHP in Laravel verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage