Using this package, you can cache your heavy and most used queries.
All you have to do is to define the CacheEntity
objects in the model and specify a valid name and ttl for them.
LaraCache will handle the rest of process automatically. It will create and update cache entities based on ttl that you've defined for each entity.
Manually updating the cache entities of models after dispatching model events (creating, updating and deleting) isn't required, LaraCache manages them in the background and ensures the most up-to-date version of each cache entity.
🚀 If you find this project interesting, please consider supporting me on the open source journey
- PHP 8.0.2 or higher
- Laravel 8.40.0 or higher
-
composer require mostafaznv/laracache
-
php artisan vendor:publish --provider="Mostafaznv\LaraCache\LaraCacheServiceProvider"
-
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Mostafaznv\LaraCache\Traits\LaraCache; class Article extends Model { use LaraCache; /** * Define Cache Entities Entities * * @return CacheEntity[] */ public static function cacheEntities(): array { return [ CacheEntity::make('list.forever') ->cache(function() { return Article::query()->latest()->get(); }), CacheEntity::make('latest') ->validForRestOfDay() ->cache(function() { return Article::query()->latest()->first(); }) ]; } }
-
use App\Models\Article; use Mostafaznv\LaraCache\Facades\LaraCache; $cache = Article::cache()->get('latest'); // or $cache = LaraCache::retrieve(Article::class, 'latest');
- Installation
- Usage
- CacheEntity Methods
- Disable/Enable Cache
- Update Cache Manually
- Delete Cache Manually
- Config Properties
- Complete Example
method | Arguments | description |
---|---|---|
setDriver | driver (type: string ) |
Specifies custom driver for cache entity |
isQueueable | status (type: bool , default: 'true') |
Specifies if cache operation should perform in the background or not |
refreshAfterCreate | status (type: bool , default: true ) |
Specifies if the cache should refresh after create a record |
refreshAfterUpdate | status (type: bool , default: true ) |
Specifies if the cache should refresh after update a record |
refreshAfterDelete | status (type: bool , default: true ) |
Specifies if the cache should refresh after delete a record |
refreshAfterRestore | status (type: bool , default: true ) |
Specifies if the cache should refresh after restore a record |
forever | Specifies that the cache should be valid forever | |
validForRestOfDay | Specify that cache entity should be valid till end of day | |
validForRestOfWeek | Specify that cache entity should be valid till end of week | |
ttl | seconds (type: int ) |
Specifies cache time to live in second |
setDefault | defaultValue (type: mixed ) |
Specifies default value for the case that cache entity doesn't have any value |
cache | Closure | Main part of each cache entity. defines cache content |
If you want to disable/enable cache, you can do it in the following two ways:
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->disable();
// or
LaraCache::disable(Article::class);
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->enable();
// or
LaraCache::enable(Article::class);
Sometimes you want to update cache entities manually.
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->update('latest');
// or
LaraCache::update(Article::class, 'latest');
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->updateAll();
// or
LaraCache::updateAll(Article::class);
This will update all cache entities that stored using LaraCache (across all models)
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
LaraCache::updateAll();
Sometimes you want to delete cache entities manually. using these methods, you can do it.
Using this feature, you can delete cache entities temporary. after spending ttl, cache entity will be generated again.
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->delete('latest');
// or
LaraCache::delete(Article::class, 'latest');
Using this feature, you can delete cache entities permanently. Cache item will be deleted forever and whenever you try to retrieve it, you will get null (or default value).
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->delete('latest', true);
// or
LaraCache::delete(Article::class, 'latest', true);
Note: Cache Entity will update after creating or updating records in your model
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->deleteAll();
// or
LaraCache::deleteAll(Article::class);
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
Article::cache()->deleteAll(true);
// or
LaraCache::deleteAll(Article::class, true);
This will delete all cache entities that stored using LaraCache (across all models)
use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;
LaraCache::deleteAll();
// forever
LaraCache::deleteAll(forever: true);
method | Type | description |
---|---|---|
driver | string (default: null ) |
The default mechanism for handling cache storage. If you keep this option null , LaraCache will use the default cache storage from config/cache.php |
laracache-list | string (default: laracache.list ) |
LaraCache uses a separate list to store name of all entities. using these keys, we can perform some actions to all entities (such as update or delete them) |
first-day-of-week | integer (default: 0 ) |
In some regions, saturday is first day of the week and in another regions it may be different. you can change the first day of a week by changing this property |
last-day-of-week | integer (default: 6 ) |
In some regions, friday is last day of the week and in another regions it may be different. you can change the last day of a week by changing this property |
queue | bool (default: false ) |
Sometimes caching process is very heavy, so you have to queue the process and do it in background. |
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Mostafaznv\LaraCache\Traits\LaraCache;
class Article extends Model
{
use LaraCache;
/**
* Define Cache Entities Entities
*
* @return CacheEntity[]
*/
public static function cacheEntities(): array
{
return [
CacheEntity::make('list.forever')
->forever()
->setDriver('redis')
->cache(function() {
return Article::query()->latest()->get();
}),
CacheEntity::make('list.day')
->isQueueable()
->validForRestOfDay()
->cache(function() {
return Article::query()->latest()->get();
}),
CacheEntity::make('list.week')
->validForRestOfWeek()
->cache(function() {
return Article::query()->latest()->get();
}),
CacheEntity::make('list.ttl')
->ttl(120)
->cache(function() {
return Article::query()->latest()->get();
}),
CacheEntity::make('latest')
->forever()
->cache(function() {
return Article::query()->latest()->first();
}),
CacheEntity::make('latest.no-create')
->refreshAfterCreate(false)
->cache(function() {
return Article::query()->latest()->first();
}),
CacheEntity::make('latest.no-update')
->refreshAfterUpdate(false)
->cache(function() {
return Article::query()->latest()->first();
}),
CacheEntity::make('latest.no-delete')
->refreshAfterDelete(false)
->cache(function() {
return Article::query()->latest()->first();
}),
CacheEntity::make('latest.no-restore')
->refreshAfterRestore(false)
->cache(function() {
return Article::query()->latest()->first();
}),
CacheEntity::make('empty.array')
->setDefault('empty value')
->cache(fn() => []),
];
}
}
🚀 If you find this project interesting, please consider supporting me on the open source journey
This software is released under The MIT License (MIT).