Erstellen Sie verschiedene Schlüssel für den Abfragecache in Laravel
P粉739886290
P粉739886290 2024-03-19 18:16:10
0
2
440

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

Antworte allen(2)
P粉401901266

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

我创建了 CacheKey 类:

class CacheKey{

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

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

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

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

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

}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage