Maison  >  Questions et réponses  >  le corps du texte

Créer différentes clés pour le cache de requêtes dans Laravel

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粉739886290P粉739886290188 Il y a quelques jours370

répondre à tous(2)je répondrai

  • P粉401901266

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

    répondre
    0
  • P粉287726308

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

    répondre
    0
  • Annulerrépondre