Créer différentes clés pour le cache de requêtes dans Laravel
P粉739886290
P粉739886290 2024-03-19 18:16:10
0
2
437

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粉739886290
P粉739886290

répondre à tous(2)
P粉401901266

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粉287726308

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

}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal