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?
我通过将函数名称传递给另一个类来解决这个问题
我创建了 CacheKey 类:
然后在存储库的任何方法中我们都可以使用这个辅助类,如下所示:
你可以通过这种方式轻松使用魔术方法: