Heim > Artikel > PHP-Framework > Lassen Sie uns darüber sprechen, wie Sie das Dekoratormuster von PHP in Laravel verwenden
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!
Designmuster sind für jeden Entwickler wichtig. Es löst sehr häufige Probleme in jedem Projekt, das Sie erstellen.
Es hilft Ihnen, einem Objekt zusätzliches Verhalten hinzuzufügen, ohne andere Objekte in derselben Klasse zu beeinflussen.
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
Nehmen wir an, wir haben ein Post-Modell
class Post extends Model { public function scopePublished($query) { return $query->where('published_at', '<=', 'NOW()'); } }
In unserem PostsController haben wir die Indexmethode wie folgt
class PostsController extends Controller { public function index() { $posts = Post::published()->get(); return $posts; } }
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; } }
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.
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); }
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);
}
}
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(); } }
在同个目录下创建具有下面内容的 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); } }
回到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); }); } }
控制器变得健康,知道足够的细节来完成工作。
在这里,我们依靠 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); } }
现在无论何时我们注入PostsRepositoryInterface
Laravel 都会创建 PostsRepository
的实例并将其返回。
我们在一开始就说过,装饰器模式允许将行为添加到单个对象,而不会影响同一类中的其他对象。
在这里缓存是行为,对象/类是 PostsRepository
。
让我们在 app/Repositories/Posts/PostsCacheRepository.php
中创建具有以下内容的PostsCacheRepository
在这个类中,我们接受 Caching 对象和 PostsRepository 对象,然后使用类(装饰器)将缓存行为添加到 PostsReposiory 实例。
我们可以使用相同的示例将HTTP请求发送到某些服务,然后在失败的情况下返回模型。我相信您会从该模式以及它是如何轻松添加行为中受益。
最后一件事是修改 AppServiceProvider 接口绑定以创建 PostsCacheRepository 实例而不是PostsRepository
rrreee现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProvider
app/Providers/AppServiceProvider.php
hinzu. rrreeePostsRepositoryInterface
injizieren, eine PostsRepository
-Instanz und gibt sie zurück Es. PostsRepository
. Lassen Sie uns PostsCacheRepository
in app/Repositories/Posts/PostsCacheRepository.php
mit dem folgenden Inhalt erstellen rrreeeWir 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. Ü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 inIn dieser Klasse akzeptieren wir Caching-Objekte und PostsRepository-Objekte und dann Verwenden Sie eine Klasse (Decorator), um der PostsRepository-Instanz Caching-Verhalten hinzuzufügen.
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!