laragear / cache-refresh
Save items in a bucket, retrieve them later.
Fund package maintenance!
Github Sponsorship
Paypal
Installs: 10 783
Dependents: 0
Suggesters: 0
Security: 0
Stars: 8
Watchers: 1
Forks: 2
Open Issues: 0
Requires
- php: ^8.1
- illuminate/cache: 10.*|11.*
- illuminate/contracts: 10.*|11.*
- illuminate/support: 10.*|11.*
Requires (Dev)
- orchestra/testbench: 8.*|9.*
README
Refresh items in your cache without data races.
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Collection; use App\Models\Message; public function send(Message $message) { Cache::refresh( $message->to, fn ($messages) => Collection::wrap($messages)->push($message) ); }
Become a sponsor
Your support allows me to keep this package free, up-to-date and maintainable. Alternatively, you can spread the word!
Requirements
- Laravel 10 or later
- Cache Driver with Lock support (*).
Warning
You can still use Cache Refresh without a driver that supports locking, but bear in mind, refreshing won't be atomic.
Installation
You can install the package via Composer:
composer require laragear/cache-refresh
Usage
Cache Refresh will retrieve a key value from your cache store that you can edit using a callback. This callback is free to change the value and return it to be persisted.
When the cached value doesn't exist, like when is first called, you will receive null
, so remember to un-null the value when is first called.
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Collection; use App\Models\Message; public function send(Message $message) { // Add the incoming message to a list of messages, refreshing the overall list. $messages = Cache::refresh( $message->to, function (?Collection $messages) use ($message) { return Collection::wrap($messages)->push($message); }, 60 * 5 ); return 'Messages has been queued'; }
Custom Expiration time
The callback also receives an Expire
instance, which will allow you to change the expiration time of the key inside the callback.
use Illuminate\Support\Facades\Cache; use Laragear\CacheRefresh\Expire; use App\Models\Mission; Cache::refresh('mission', function ($mission, Expire $expire) { $mission ??= new Mission(); if ($mission->ongoing()) { // Set a new expiration time. $expire->at(today()->endOfDay()); } if ($mission->completed()) { // Expire the value immediately. $expire->now(); } if ($mission->isVeryDifficult()) { // Put it forever. $expire->never(); } return $mission; }, 60 * 5);
Custom Lock configuration
You can omit a callback to manage the lock time and the waiting time using lock()
and waitFor()
, respectively, and issue the callback using put()
.
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Collection; use App\Models\Message; Cache::refresh('mission')->lock(60)->waitFor(10)->put(fn ($value) => ..., 60 * 5);
PhpStorm stubs
For users of PhpStorm, there is a stub file to aid in macro autocompletion for this package. You can publish them using the phpstorm
tag:
php artisan vendor:publish --provider="Laragear\CacheRefresh\CacheRefreshServiceProvider" --tag="phpstorm"
The file gets published into the .stubs
folder of your project. You should point your PhpStorm to these stubs.
Laravel Octane compatibility
- There are no singletons using a stale application instance.
- There are no singletons using a stale config instance.
- There are no singletons using a stale request instance.
There should be no problems using this package with Laravel Octane.
Security
If you discover any security related issues, please email darkghosthunter@gmail.com instead of using the issue tracker.
License
This specific package version is licensed under the terms of the MIT License, at time of publishing.
Laravel is a Trademark of Taylor Otwell. Copyright © 2011-2024 Laravel LLC.