Maison > Questions et réponses > le corps du texte
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 ?
P粉4019012662024-03-20 15:30:59
J'ai résolu ce problème en passant le nom de la fonction à une autre classe
J'ai créé la classe CacheKey :
class CacheKey{ public static function generate(Model $model, $functionName):string { return $model->getTable()."_".$functionName; } }
Ensuite, dans n'importe quelle méthode du référentiel, nous pouvons utiliser cette classe d'assistance comme ceci :
$cacheKey = CacheKey::generate($this->model,__FUNCTION__);
P粉2877263082024-03-20 15:11:01
Vous pouvez facilement utiliser la méthode magique de cette façon :
class CacheService { private const $cacheableMethods = ['paginate']; private $otherSerivce; public __construct($otherSerivce) { $this->otherSerivce = $otherSerivce; } public __get($method, $args) { if(!in_array($method, static::$cachableMethods)) { return $this->otherSerivce->{$method}(...$args); } return Cache::remember(implode([$method, ...$args], ':'), function () { return $this->otherSerivce->{$method}(...$args); }); } }