Laravel Toplu Cache Silme

Laravel
Görüntülenme : 280 28 Kasım 2022

Bu yazı Laravel FileCache kullananlar içindir.

Laravel File Cache kullanıyorsanız, Cache isimleri sha1 şifreli olarak tutulduğu için toplu olarak bir silme yapamıyorsunuz.

Cache isimlerini nasıl kendim özel olarak tutabilirim ve silebilirim şeklinde uzun bir araştırma yaptım.

Kendi özel FileStore sınıfımızı yazarak bu işlemleri gerçekleştirebiliriz.

Aşağıda benim kullanmış olduğum kodları bulabilirsiniz.

İlk Önce App klasörü altında Extensions adında klasör ve içerisine FileStore.php isminde dosya oluşturalım.

<?php

namespace App\Extensions;

class FileStore extends \Illuminate\Cache\FileStore
{
		protected function path($key)
		{
				return $this->directory . '/cache/' . $key;
		}

		public function multipleForget($key)
		{
				foreach (glob($this->directory . '/cache/' . $key . "*") as $filename) {
						unlink($filename);
				}
				return true;
		}
}

Dosya içeriği bu şekilde değiştirip kayıt edelim.

App/Providers/AppServiceProvider.php dosyasını açın.

register() fonksiyonu içerisine aşağıdaki kodu yazın.

$this->app->booting(function () {
		Cache::extend('file', function ($app) {
				return Cache::repository(new FileStore($app['files'], config('cache.stores.file.path'), null));
		});
});

İşlemlerimiz bu kadar şimdi toplu olarak cache silebiliriz.

**Dikkat Edilmesi Gereken Hususlar

Dosya ismini direkt olarak key olarak yazdırdığımız için Cacheleri kayıt ederken bizim şifreleme yapmamız gerekir.

Örnek bir cache örneği;

Cache::remember('yazilar_ara_' . sha1($search_text . $page), 600, function () {
		return "SORGU"
});

Cache isimlerinde özel karakterler kullanmayın .*?!.

Kullanıcıdan gelen bir değeri cache işlemine alıyorsanız o kısmın değerini sha1 veya başka hash methodları ile şifreleyin.

Nasıl Toplu Olarak Silebilirim?

Cache::multipleForget('yazilar_ara_');

Bu şekilde bir çağırma yaptığınız zaman yazilar_ara_ ile başlayan tüm cacheleri silecektir.

Tek tek silmek istersenizde forget ile silebilirsiniz.

Cache::forget('kategoriler');