Laravelでクエリキャッシュ用に別のキーを作成する
P粉739886290
P粉739886290 2024-03-19 18:16:10
0
2
414

すべてのクエリをキャッシュするためにプロジェクトでリポジトリを使用しています。

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

###これはいい。しかし、問題は、このコードがクラスのすべてのメソッドで繰り返されることです。 このコードを別のクラスで使用すると、メソッド名が正しくなくなります。 このコードの重複を防ぐための提案はありますか?

P粉739886290
P粉739886290

全員に返信(2)
P粉401901266

関数名を別のクラスに渡すことでこの問題を解決しました

CacheKey クラスを作成しました:

クラスキャッシュキー{

    パブリック静的関数generate(Model $model, $functionName):string
    {
        return $model->getTable()."_".$functionName;
    }
}

その後、リポジトリの任意のメソッドで、このヘルパー クラスを次のように使用できます。

$cacheKey = CacheKey::generate($this->model,__FUNCTION__);​​
いいねを押す +0
P粉287726308

この方法で魔法のメソッドを簡単に使用できます:

クラス CacheService {
    private const $cacheableMethods = ['paginate'];
    プライベート $otherService;
    public __construct($otherService) {
       $this->otherService = $otherService;
    }

    public __get($method, $args) {
        if(!in_array($method, static::$cachableMethods)) {
          return $this->otherService->{$method}(...$args);
        }

        return Cache::remember(implode([$method, ...$args], ':'), function () {
            return $this->otherService->{$method}(...$args);
        });
    }

}
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート