すべてのクエリをキャッシュするためにプロジェクトでリポジトリを使用しています。
BaseRepository があります。
Illuminate\Database\Eloquent\Model を使用します。 Illuminate\Support\Facades\Cache を使用します。 class BaseRepository は BaseRepositoryInterface{ を実装します 保護された $model; protected int $cacheDuration = 600; // 秒ごと パブリック関数 __construct(Model $model) { $this->model = $model を返します。 } パブリック関数 paginate(int $paginate,string $cacheKey) { return Cache::remember($cacheKey,$this->cacheDuration , function () use ($paginate) { return $this->model->latest()->paginate($paginate); }); } // 他のメソッド ... }
その後、このリポジトリをサービスで使用しました
### 郵便サービス: ###Illuminate\Support\Facades\App を使用します。 クラスポストサービス{ public PostRepositoryInterface $postRepository; パブリック関数 __construct() { $this->postRepository = App::make(PostRepositoryInterface::class); } public function paginate(int $paginate, string $cacheKey) { return $this->postRepository->paginate($paginate,$cacheKey); } }
最後に、コントローラーで PostServiceを使用しました
リアコントローラー:
クラス PostController はコントローラーを拡張します{ パブリック PostService $postService; パブリック関数 __construct() { $this->postService = App::make(PostService::class); } パブリック関数インデックス() { 文字列 $cacheKey = "posts.paginate"; return $this->postService->paginate(10); } }
index メソッドは、最初の最新の 10 レコードを正しく返します。次に、すべてのリポジトリ クエリに対して一意の CacheKey を作成する必要があります。例えば###TableName concat FunctionName //posts.paginate
したがって、このコードはリポジトリのすべてのメソッドで使用できます
パブリック関数 paginate(int $paginate) { $cacheKey = $this->model->getTable().__FUNCTION__; return Cache::remember($cacheKey,$this->cacheDuration , function () use ($paginate) { return $this->model->latest()->paginate($paginate); }); }
###これはいい。しかし、問題は、このコードがクラスのすべてのメソッドで繰り返されることです。 このコードを別のクラスで使用すると、メソッド名が正しくなくなります。 このコードの重複を防ぐための提案はありますか?
関数名を別のクラスに渡すことでこの問題を解決しました
CacheKey クラスを作成しました:
その後、リポジトリの任意のメソッドで、このヘルパー クラスを次のように使用できます。
この方法で魔法のメソッドを簡単に使用できます: