laragear/cache-refresh

Save items in a bucket, retrieve them later.

v2.0.0 2024-03-06 23:23 UTC

This package is auto-updated.

Last update: 2024-10-13 07:40:57 UTC


README

Latest Version on Packagist Latest stable test run Codecov coverage Maintainability Sonarcloud Status Laravel Octane Compatibility

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.