LaravelでPHPのデコレータパターンを使用する方法について話しましょう

青灯夜游
リリース: 2022-09-20 20:26:36
転載
2332 人が閲覧しました

Laravel で PHP のデコレータ パターンを使用するにはどうすればよいですか? LaravelでのPHPデコレータモードの使い方については以下の記事で紹介していますので、ご参考になれば幸いです。

LaravelでPHPのデコレータパターンを使用する方法について話しましょう

#デザイン パターンはすべての開発者にとって重要です。構築するすべてのプロジェクトでよくある問題を解決します。

デコレータ パターン定義:

同じクラス内の他のオブジェクトに影響を与えることなく、オブジェクトに特別な動作を追加するのに役立ちます。

Wikipedia:

デコレータ パターンは、単一のオブジェクトに動作を動的に追加できるようにするデザイン パターンです。同じクラス内の他のオブジェクトの動作

質問

Post モデルがあるとします。

class Post extends Model
{
    public function scopePublished($query) {
        return $query->where('published_at', '<=&#39;, &#39;NOW()&#39;);
    }
}
ログイン後にコピー

In PostsController には、次のようなインデックス メソッドがあります。

class PostsController extends Controller
{
    public function index() {
        $posts = Post::published()->get();
        return $posts;
    }
}
ログイン後にコピー
投稿をキャッシュし、投稿をリストする必要があるたびにデータベースにクエリを実行するのを避けるために、次の

class PostsController extends Controller
{
    public function index() {
        $minutes = 1440; # 1 day
        $posts = Cache::remember('posts', $minutes, function () {
            return Post::published()->get();
        });
        return $posts;
    }
}
ログイン後にコピー
を実行できます。投稿は 1 日間キャッシュされます。しかし、コードを見ると、コントローラーはあまりにも多くのことを知っています。それは私たちがそれをキャッシュした日数を知っており、オブジェクト自体をキャッシュします。

同様に、HomePageController のタグ、カテゴリ、アーカイブにも同じ機能を実装しているとします。これは、読んで保守するにはコードが多すぎます。

ウェアハウス パターン

ほとんどの場合、ウェアハウス パターンはデコレータ パターンに接続されています。

まず、

repository パターンを使用して投稿の取得方法を分離し、次のような app/Repositories/Posts/PostsRepositoryInterface.php

namespace App\Repositories\Posts;

interface PostsRepositoryInterface 
{

    public function get();

    public function find(int $id);

}
ログイン後にコピー
# を作成します。次のコンテンツ ##次のコンテンツを含む PostsRepository を同じディレクトリに作成します

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">namespace App\Repositories\Posts; use App\Post; class PostsRepository implements PostsRepositoryInterface {     protected $model;     public function __construct(Post $model) {         $this-&gt;model = $model;     }     public function get() {         return $this-&gt;model-&gt;published()-&gt;get();     }     public function find(int $id) {         return $this-&gt;model-&gt;published()-&gt;find($id);     } }</pre><div class="contentsignin">ログイン後にコピー</div></div> 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

にバインディング メソッドを追加します <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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-&gt;app-&gt;bind(PostsRepositoryInterface::class,PostsRepository::class);     } }</pre><div class="contentsignin">ログイン後にコピー</div></div>Now を注入するたびに

PostsRepositoryInterface

Laravel は # のインスタンスを作成します#PostsRepository を返し、それを返します。

デコレータによるキャッシュ冒頭で、デコレータ パターンを使用すると、オブジェクト内の他のオブジェクトに影響を与えることなく、単一のオブジェクトに動作を追加できると述べました。同じクラス。

ここではキャッシュが動作であり、オブジェクト/クラスは

PostsRepository

です。

次の内容を含む PostsCacheRepository を

app/Repositories/Posts/PostsCacheRepository.php

に作成しましょう このクラスでは、Caching オブジェクトと PostsRepository オブジェクトを受け入れ、クラス (デコレータ) を使用して、PostsRepository インスタンスにキャッシュ動作を追加します。 同じ例を使用して、HTTP リクエストを何らかのサービスに送信し、失敗した場合にはモデルを返すことができます。このパターンと、動作の追加がいかに簡単であるかがメリットになると思います。 最後に、AppServiceProvider インターフェイス バインディングを変更して、PostsRepository の代わりに 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);
        });
    }
}
ログイン後にコピー

ここでファイルをもう一度確認すると、読み取りと保守が非常に簡単であることがわかります。 。同様に、ある時点でキャッシュ層を削除することにした場合もテスト可能です。

AppServiceProvider

のバインディングを変更するだけです。追加の変更は必要ありません。

#結論

デコレータ パターンを使用してモデルをキャッシュする方法を学びましたウェアハウスがどのように機能するかを示しましたパターン デコレータ パターンへの接続依存性注入と Laravel IOC で私たちの生活が楽になる方法

    Laravel コンポーネントは強力です
  • この記事を楽しんで読んでいただければ幸いです。強力なデザイン パターンと、プロジェクトの保守と管理を容易にする方法を示します。
  • 元のアドレス: https://dev.to/ahmedash95/design-patterns-in-php-decorator-with -laravel-5hk6
[関連する推奨事項:

laravel ビデオ チュートリアル

]

以上がLaravelでPHPのデコレータパターンを使用する方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!