Laravel, очистка кэша пагинации
На сайте используется кэш драйвер default
. Допустим пагинация кэшируется примерно так:
App\Http\Controllers\ProductController
$currentPage = request()->get('page',1);
$category = Cache::remember('products.' . $currentPage, 10, function(){
return Product::orderBy('updated_at', 'desc')->where(['derc' => 1,'elaninnovu' => 'Satılır'])->paginate(10);
});
Подскажите, если в админке редактировать или удалять модель Product
, как правильно очищать кэш?
Ещё нужно учесть что кэшируются не только продукты, но и другие модели и дополнительные данные, у которых название кэша различается.
А также продукты могут кэшироваться как отношение в модели Category::with('products')
.
т.е. суть проблемы в том, что нужно или удалять определённые кэши с определёнными названиями, или удалять сразу весь кэш.
app\Models\Product
protected static function boot()
{
parent::boot();
static::deleted(function(Model $model) {
$name = 'products.somecachename';
Cache::forget($name);
Cache::rememberForever($name, function () {
return Product::orderBy('updated_at', 'desc')->where(['derc' => 1,'elaninnovu' => 'Satılır'])->paginate(10);
});
});
}
Правильным ли будет решение если при сохранении в кэше данных, допустим модели Product
, записывать отдельно в кэш все созданные названия кэша?
App\Providers\EventServiceProvider
public function boot(): void
{
parent::boot();
Event::listen(function (\Illuminate\Cache\Events\KeyWritten $event) {
if ($event->key == 'allCache') return;
$allCache = cache('allCache') ?? [];
if (!in_array($event->key, $allCache)) {
$allCache[] = $event->key;
cache(['allCache' => $allCache]);
}
});
}
а потом очищать кэш:
app\Models\Product
protected static function boot()
{
parent::boot();
static::deleted(function(Model $model) {
$allCache = cache('allCache') ?? [];
foreach ($allCache as $cache) {
cache()->forget($cache);
}
});
}