Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3
An improved helper for working with cache
License
TheDragonCode/laravel-cache
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
To get the latest version ofSmart Cache, simply require the project usingComposer:
composer require dragon-code/laravel-cache
Or manually updaterequire block ofcomposer.json and runcomposer update.
{"require": {"dragon-code/laravel-cache":"^4.0" }}Information on upgrade from version 3 to 4 is located in theUPGRADE file.
In addition to passing an explicit value, you can also pass objects and arrays to thekeys andtags methods.
For example:
useDragonCode\Cache\Services\Cache;useTests\Fixtures\Dto\DtoObject;useTests\Fixtures\Simple\CustomObject;$arr1 = ['foo','bar'];$arr2 =newArrayObject(['foo','bar']);$arr3 = DtoObject::make(['foo' =>'Foo','bar'=>'Bar']);$arr4 =newCustomObject();Cache::make()->key($arr1)->tags($arr1);Cache::make()->key($arr2)->tags($arr3);Cache::make()->key($arr2)->tags($arr3);Cache::make()->key($arr4)->tags($arr4);Cache::make() ->key([$arr1,$arr2,$arr3,$arr4,'foo','bar']) ->tags([$arr1,$arr2,$arr3,$arr4,'foo','bar']);
Unpacking and processing of objects occurs as follows:
useDragonCode\Cache\Services\Cache;useTests\Fixtures\Dto\DtoObject;useTests\Fixtures\Simple\CustomObject;['Foo','Bar'];// as key: ['Foo', 'Bar']// as tag: ['foo', 'bar']newArrayObject(['Foo','Bar']);// as key: ['Foo', 'Bar']// as tag: ['foo', 'bar']DtoObject::make(['foo' =>'Foo','bar'=>'Bar']);// as key: ['Foo', 'Bar']// as tag: ['foo', 'bar']newCustomObject();// as key: ['Foo']// as tag: ['foo']
Since the main problem of working with the cache's key compilation, this package solves it.
By passing values to thekeys method, we get a ready-made key at the output.
The hash is formed by the valuekey=value, which allows avoiding collisions when passing identical objects.
In the case of passing nested arrays, the key is formed according to the principlekey1.key2=value, wherekey1andkey2 are the keys of each nested array.
For example:
useDragonCode\Cache\Services\Cache;Cache::make()->key('foo','bar', [null,'baz','baq']);// Key is `d76f2bde023f5602ae837d01f4ec1876:660a13c00e04c0d3ffb4dbf02a84a07a:6fc3659bd986e86534c6587caf5f431a:bd62cbee62e027d0be4b1656781edcbf`
This means that when writing to the cache, the tree view will be used.
For example:
useDragonCode\Cache\Services\Cache;Cache::make()->key('foo','foo')->put('Foo');Cache::make()->key('foo','bar')->put('Bar');Cache::make()->key('baz')->put('Baz');// d76f2bde023f5602ae837d01f4ec1876:// 086f76c144511e1198c29a261e87ca50: Foo// 660a13c00e04c0d3ffb4dbf02a84a07a: Bar// 1b9829f3bd21835a15735f3a65cc75e9: Baz
In some cases, you need to disable the use of the key hashing mechanism.To do this, simply call thehashKey(false) method:
useDragonCode\Cache\Services\Cache;Cache::make()->key('foo','foo')->hashKey(false)->put('Foo');Cache::make()->key('foo','bar')->hashKey(false)->put('Bar');Cache::make()->key('baz')->hashKey(false)->put('Baz');// 0=foo:// 1=foo: Foo// 1=bar: Bar// 0=baz: Baz
useDragonCode\Cache\Services\Cache;Cache::make()->key([ ['foo' =>'Foo'], ['bar' =>'Bar'], [['Baz','Qwerty']],])->hashKey(false)->put('Baz');// 0.foo=Foo:1.bar=Bar:2.0.0=Baz:2.0.1=Qwerty
In some cases, it is necessary to bind the cache to certain users. To do this, we have added thewithAuth helper.
useDragonCode\Cache\Services\Cache;useIlluminate\Support\Facades\Auth;Cache::make()->withAuth()->key('foo','bar');// instead ofCache::make()->key(get_class(Auth::user()), Auth::id(),'foo','bar');
When processing requests with a call to the withAuth method, the binding will be carried out not only by identifier, butalso by reference to the model class, since a project canhave several models with the possibility of authorization.
For example,App\Models\Employee,App\Models\User.
useDragonCode\Cache\Services\Cache;$cache = Cache::make() ->key('foo','bar', ['baz','baq']) ->ttl(200,true);// When `true` is equal to 200 minutes.// When `false` is equal to 200 seconds.// By default, `true`$cache->put(staticfn() =>'Some value');// or$cache->put('Some value');// Contains cached `Some value`$cache->remember(staticfn() =>'Some value');// or$cache->remember('Some value');// Contains cached `Some value`$cache->rememberForever(staticfn() =>'Some value');// or$cache->rememberForever('Some value');// Contains cached `Some value`// Uses the functionality of the `Cache::flexible()` method$cache->flexible(50)->remember('Some value');// equals `Cache::flexible($key, [50, 200], fn () => 'Some value')`$cache->flexible(-50)->remember('Some value');// equals `Cache::flexible($key, [150, 200], fn () => 'Some value')`$cache->flexible(0)->remember('Some value');// By default, `0`// equals `Cache::flexible($key, [170, 200], fn () => 'Some value')`// (200 - 15%) = 170$cache->flexible(50,true);// 50 minutes$cache->flexible(50,false);// 50 seconds$cache->flexible(0,false);// the `true/false` modifier is not used$cache->get();// Returns cached `Some value`$cache->has();// Returns `true`$cache->doesntHave();// Returns `false`$cache->forget();// Will remove the key from the cache.$cache->flush();// Clears keys or tags by value
useDragonCode\Cache\Services\Cache;useApp\Models\User;$user = User::first();$cache = Cache::make()->key('foo');$cache->put(staticfn() =>$user);// or$cache->put($user);// Contains cached `$user`$cache->remember(staticfn() =>$user);// or$cache->remember($user);// Contains cached `$user`$cache->rememberForever(staticfn() =>$user);// or$cache->rememberForever($user);// Contains cached `$user`$cache->flexible()->remember($user);// Returns User model with flexibility$cache->get();// Returns User model$cache->has();// Returns `true`$cache->doesntHave();// Returns `false`$cache->forget();// Will remove the key from the cache.$cache->flush();// Clears keys or tags by value
Sometimes in the process of working with a cache, it becomes necessary to call some code between certain actions, and inthis case thecall method will come to the rescue:
useDragonCode\Cache\Services\Cache;$cache = Cache::make()->key('foo');$warmUp =false;$cache ->call(fn (Cache$cache) =>$cache->forget(),$warmUp) ->call(fn () =>$someService->someMethod()) ->remember('foo');
In addition, theforget method now returns an instance of theCache object, so it can be used like this:
useDragonCode\Cache\Services\Cache;$cache = Cache::make()->key('foo');$cache ->forget() ->call(fn () =>$someService->someMethod()) ->remember('foo');
Previously, you had to use the following sequence:
useDragonCode\Cache\Services\Cache;$cache = Cache::make()->key('foo');$warmUp =false;if ($warmUp) {$cache->forget();}$someService->someMethod()$cache->remember('foo');
By default, the cache will be written for 1 day.
The cache will be written for the specified number of minutes, seconds or theDateTimeInterface instance.
It does not matter in which direction the time shift will be. During processing, the value is converted to theabs().
useCarbon\Carbon;useDateTime;useDragonCode\Cache\Services\Cache;useDragonCode\Cache\Support\Ttl;Cache::make()->ttl(10);Cache::make()->ttl('10');Cache::make()->ttl(fn () =>10);Cache::make()->ttl(Carbon::now()->addDay());Cache::make()->ttl(newDateTime('tomorrow'));
useCarbon\Carbon;useDateTime;useDragonCode\Cache\Services\Cache;Cache::make()->ttl(10,false);Cache::make()->ttl('10',false);Cache::make()->ttl(fn () =>10,false);Cache::make()->ttl(Carbon::now()->addDay(),false);Cache::make()->ttl(newDateTime('tomorrow'),false);
You can also store all TTL values in one place - in theconfig/cache.php file.
To do this, add attl block to the file anddefine a TTL for the objects.
After that you can use the following construction:
useDragonCode\Cache\Services\Cache;useTests\Fixtures\Simple\CustomObject;Cache::make()->ttl(CustomObject::class);Cache::make()->ttl(newCustomObject());Cache::make()->ttl('custom_key');Cache::make()->ttl((object) ['foo' =>'Foo']);// You can also specify that these values are in seconds, not minutes:Cache::make()->ttl(CustomObject::class,false);Cache::make()->ttl(newCustomObject(),false);Cache::make()->ttl('custom_key',false);Cache::make()->ttl((object) ['foo' =>'Foo'],false);
If the value is not found, thedefault value will be taken, which you can also override intheconfiguration file.
For repositories that support tagging, the keys will be saved separated by tags.
useDragonCode\Cache\Services\Cache;$cache = Cache::make() ->tags('actor','author') ->key('foo','bar', ['baz','baq']);$cache->put(staticfn() =>'Some value');// or$cache->put('Some value');// Contains cached `Some value`$cache->get();// Returns cached `Some value`$cache->has();// Returns `true`$cache->doesntHave();// Returns `false`$cache->forget();// Will remove the key from the cache.$cache->flush();// Clears keys or tags by value
To retrieve a tagged cache item, pass the same ordered list of tags to the tags method and then call the get method withthe key you wish to retrieve:
useDragonCode\Cache\Services\Cache;$cache = Cache::make()->key('foo','bar');$cache->tags('actor','author')->put(staticfn() =>'Some value');// or$cache->tags('actor','author')->put('Some value');// Contains cached `Some value`$cache->tags('actor','author')->get();// Returns cached `Some value`$cache->tags('actor')->get();// Returns `null`$cache->tags('author')->get();// Returns `null`$cache->tags('author')->flush();// Clears keys or tags by value
See the official Laraveldocumentation.
Passingwhen = false will not write to the cache.
useDragonCode\Cache\Services\Cache;$cache = Cache::make() ->when(false) ->key('foo','bar');$value =$cache->put(staticfn() =>'Some value');// or$value =$cache->put('Some value');// Returns `Some value`$cache->get();// Returns `null`$cache->has();// Returns `false`$cache->doesntHave();// Returns `true`
You can also define whether to enable or disable the use of cache storage in the settings.
For example:
// config/cache.phpreturn ['enabled' => [// App\Models\Page::class => true,//// 'stdClass' => false,//// 'foo' => false, ],];
useApp\Services\Some;useDragonCode\Cache\Services\Cache;// as string$cache = Cache::make()->when('foo');// as class-string$cache = Cache::make()->when(Some::class);$cache = Cache::make()->when(static::class);$cache = Cache::make()->when(self::class);// as class$cache = Cache::make()->when(newSome);$cache = Cache::make()->when($this);// as stdClass$cache = Cache::make()->when((object)['foo' =>'Foo']);
This package's licensed under theMIT License.
About
An improved helper for working with cache
Topics
Resources
License
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Contributors5
Uh oh!
There was an error while loading.Please reload this page.