Laravel, очистка кэша пагинации

Рейтинг: 0Ответов: 0Опубликовано: 14.06.2023

На сайте используется кэш драйвер 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);
        }
        
    });
}

Ответы

Ответов пока нет.