J'utilise un référentiel dans un projet pour mettre en cache toutes les requêtes.
Il existe un BaseRepository.
use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Cache; class BaseRepository implements BaseRepositoryInterface{ protected $model; protected int $cacheDuration = 600; //per seconds public function __construct(Model $model) { return $this->model = $model; } public function paginate(int $paginate,string $cacheKey) { return Cache::remember($cacheKey,$this->cacheDuration , function () use ($paginate) { return $this->model->latest()->paginate($paginate); }); } // other methods ... }
Ensuite, j'ai utilisé ce référentiel dans mon service
Service postal :
use Illuminate\Support\Facades\App; class PostService{ public PostRepositoryInterface $postRepository; public function __construct() { $this->postRepository = App::make(PostRepositoryInterface::class); } public function paginate(int $paginate, string $cacheKey) { return $this->postRepository->paginate($paginate,$cacheKey); } }
Enfin, j'ai utilisé PostService dans le contrôleur
Contrôleur arrière :
class PostController extends Controller{ public PostService $postService; public function __construct() { $this->postService = App::make(PostService::class); } public function index() { string $cacheKey = "posts.paginate"; return $this->postService->paginate(10); } }La méthode
index renverra correctement les 10 premiers enregistrements les plus récents. Je dois maintenant créer une CacheKey unique pour toutes les requêtes du référentiel. Par exemple
TableName concat FunctionName // posts.paginate
Je peux donc utiliser ce code dans toutes les méthodes du référentiel
public function paginate(int $paginate) { $cacheKey = $this->model->getTable().__FUNCTION__; return Cache::remember($cacheKey,$this->cacheDuration , function () use ($paginate) { return $this->model->latest()->paginate($paginate); }); }
C'est bien. Mais le problème est que ce code est répété dans toutes les méthodes de la classe. Si j'utilise ce code dans une autre classe, le nom de la méthode sera incorrect. Avez-vous des suggestions pour éviter la duplication de ce code ?
J'ai résolu ce problème en passant le nom de la fonction à une autre classe
J'ai créé la classe CacheKey :
Ensuite, dans n'importe quelle méthode du référentiel, nous pouvons utiliser cette classe d'assistance comme ceci :
Vous pouvez facilement utiliser la méthode magique de cette façon :