Heim  >  Fragen und Antworten  >  Hauptteil

Erstellen Sie verschiedene Schlüssel für den Abfragecache in Laravel

Ich verwende ein Repository in einem Projekt, um alle Abfragen zwischenzuspeichern.

Es gibt ein 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 ...
}

Dann habe ich dieses Repository in meinem Dienst verwendet

Postdienst:

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

Endlich habe ich PostService im Controller verwendet

Hinterer Controller:

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

index-Methode gibt die ersten 10 neuesten Datensätze korrekt zurück. Jetzt muss ich einen eindeutigen CacheKey für alle Repository-Abfragen erstellen. Zum Beispiel

TableName concat FunctionName // posts.paginate

Damit ich diesen Code in allen Methoden des Repositorys verwenden kann

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

Das ist gut. Das Problem besteht jedoch darin, dass dieser Code in allen Methoden der Klasse wiederholt wird. Wenn ich diesen Code in einer anderen Klasse verwende, ist der Methodenname falsch. Haben Sie Vorschläge, um eine Duplizierung dieses Codes zu verhindern?

P粉739886290P粉739886290188 Tage vor371

Antworte allen(2)Ich werde antworten

  • P粉401901266

    P粉4019012662024-03-20 15:30:59

    我通过将函数名称传递给另一个类来解决这个问题

    我创建了 CacheKey 类:

    class CacheKey{
    
        public static function generate(Model $model, $functionName):string
        {
            return $model->getTable()."_".$functionName;
        }
    }

    然后在存储库的任何方法中我们都可以使用这个辅助类,如下所示:

    $cacheKey = CacheKey::generate($this->model,__FUNCTION__);

    Antwort
    0
  • P粉287726308

    P粉2877263082024-03-20 15:11:01

    你可以通过这种方式轻松使用魔术方法:

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

    Antwort
    0
  • StornierenAntwort