CodeWriteson
app/Models/Utilities/UsesCache.php
trait UsesCache
{
public function clearCache()
{
Cache::tags(static::CACHE_TAG)->flush();
}
}
app/Models/Category.php
class Category extends Model
{
use UsesCache;
public const CACHE_TAG = 'category';
}
app/Providers/EventServiceProvider.php
public function boot()
{
parent::boot();
Event::listen(['eloquent.saved: *', 'eloquent.deleted: *'], function ($eventName, array $data) {
tap($data[0], function ($model) {
if (method_exists($model, 'clearCache')) {
$model->clearCache();
}
});
});
}
Bir model eklenirken/eklendiğinde, güncellenirken/güncellendiğinde ayrıca saving/saved olayları da ateşlenir. Bunun dışında silinrken/silindiğinde deleting/deleted olayları ateşlenir. Yani model üzerindeki modifikasyonları sadece iki olay ile, saved ve deleted olayları ile yakalayabiliriz demek oluyor.
Event::listen() yöntemi olayları tekil değil de global olarak yakalamak için kullanılabilen bir yöntem, global dinleyici:
Event::listen('*', function ($eventName, array $data) {
Log::info($eventName);
Log::info($data);
});
şeklinde bir kodu app/Providers/EventServiceProvider.php içinde örnekteki gibi boot yöntemi içerisine koyarsanız (başka bir providerın boot yöntemi de olabilir, deferred provider olmasın yeterli) uygulamanızda gezerken ateşlenen olayları loglayabilirsiniz (sadece model olayları değil yani). Örneğin bir model oluşturduğunuzda $eventName değeri "eloquent.created: App\Models\User" olur, $data dizisinin ilk elemanı ise oluşturulan model olur.
Ben örnekte model olaylarını yani Eloquent olaylarını yakalıyorum, eğer modelin içinde clearCache yöntemi varsa onun ateşlenmesini sağlıyorum.