mostafaznv/laracache

LaraCache is a customizable cache trait to cache queries on model's events

2.4.1 2024-11-15 07:27 UTC

This package is auto-updated.

Last update: 2024-12-12 13:14:39 UTC


README

GitHub Workflow Status Codecov branch Quality Score GitHub license Packagist Downloads Latest Version on Packagist

laracache

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.

In addition to the core LaraCache package, I have developed a complementary package called Nova LaraCache. Nova LaraCache seamlessly integrates LaraCache with Laravel Nova, the administration panel for Laravel applications. It offers a user-friendly interface within the Laravel Nova administration panel, enabling users to conveniently moderate and manage cache entities.

I am on an open-source journey 🚀, and I wish I could solely focus on my development path without worrying about my financial situation. However, as life is not perfect, I have to consider other factors.

Therefore, if you decide to use my packages, please kindly consider making a donation. Any amount, no matter how small, goes a long way and is greatly appreciated. 🍺

Donate

Requirements:

  • PHP 8.0.2 or higher
  • Laravel 8.40.0 or higher

Installation

  1. Install the package via composer:
    composer require mostafaznv/laracache
  2. Publish config file:
    php artisan vendor:publish --provider="Mostafaznv\LaraCache\LaraCacheServiceProvider"
  3. Done

Usage

  1. Add LaraCache trait to the model
    <?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();
                    })
            ];
        }
    }
  2. Retrieve Cache
    use App\Models\Article;
    use Mostafaznv\LaraCache\Facades\LaraCache;
    
    
    $cache = Article::cache()->get('latest');
    // or
    $cache = LaraCache::retrieve(Article::class, 'latest');

Table of Contents:

CacheEntity Methods

Disable/Enable Cache

If you want to disable/enable cache, you can do it in the following two ways:

Disable

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->disable();
// or 
LaraCache::disable(Article::class);

Enable

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->enable();
// or 
LaraCache::enable(Article::class);

Update Cache Manually

Sometimes you want to update cache entities manually.

Update an Entity

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->update('latest');
// or 
LaraCache::update(Article::class, 'latest');

Update all Entities

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->updateAll();
// or 
LaraCache::updateAll(Article::class);

Update all LaraCache Entities

This will update all cache entities that stored using LaraCache (across all models)

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;

 
LaraCache::updateAll();

Delete Cache Manually

Sometimes you want to delete cache entities manually. using these methods, you can do it.

Delete an Entity

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');

Delete an Entity Forever

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

Delete all Model Entities

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->deleteAll();
// or 
LaraCache::deleteAll(Article::class);

Delete all Model Entities Forever

use App\Models\Article;
use Mostafaznv\LaraCache\Facades\LaraCache;


Article::cache()->deleteAll(true);
// or 
LaraCache::deleteAll(Article::class, true);

Delete all LaraCache Entities

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);

Artisan Commands

This feature allows you to update or delete multiple cache entities of one or more models from the console command. This means you can programmatically control the cache data outside the caching cycle.

You can also create groups of models and their entities in the config file and easily update or delete all their entities at once.

Update Cache

# updates all entities of article model
php artisan laracache:update -m Article

# updates specified entities of article model
php artisan laracache:update -m Article -e latest -e featured

# updates all entities of article and product models
php artisan laracache:update -m Article -m Product

# defines model with full namespace
php artisan laracache:update -m "Domain\Article\Models\Article"

Delete Cache

# deletes all entities of article model
php artisan laracache:delete -m Article

# deletes specified entities of article model
php artisan laracache:delete -m Article -e latest -e featured

# deletes all entities of article and product models
php artisan laracache:delete -m Article -m Product

# defines model with full namespace
php artisan laracache:delete -m "Domain\Article\Models\Article"

Note: If you don't specify any entity, all entities will be operated.

Note: If you specify multiple models, you can't specify any entity and all entities of all models will be operated.

Group Operations

# updates all entities of models that are in group-1
php artisan laracache:update-group group-1

# deletes all entities of models that are in group-1
php artisan laracache:delete-group group-1

This is an example of a group configuration:

# config/laracache.php
return [
    // ...
    'groups' => [
        'group-1' => [
            [
                'model' => \App\Models\User::class,
                'entities' => [
                    'users.latest', 'users.featured'
                ],
            ],
            [
                'model' => \App\Models\Article::class,
                'entities' => [],
            ]
        ],

        'group-2' => [
            [
                'model' => \App\Models\Article::class,
                'entities' => [
                    'featured-list', 'latest'
                ],
            ],
            [
                'model' => \App\Models\User::class,
                'entities' => ['users.latest'],
            ]
        ],
    ]
];

Laravel Nova Support

Nova LaraCache is a powerful Laravel Nova package that extends the functionalities of LaraCache by integrating it seamlessly with Laravel Nova. It provides an intuitive interface within the Laravel Nova administration panel, allowing users to effortlessly moderate and manage cache entities.

With Nova LaraCache, users can conveniently monitor cache expiration dates, review cache entity contents, regenerate cache items, and delete specific cache entries.

To unlock the cache management capabilities provided by Nova LaraCache, please refer to the installation instructions and consult the LaraCache documentation for guidance on creating cache entities for each model.

Config Properties

Complete Example

<?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')
                ->isQueueable(true, 'redis', 'low')
                ->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() => []),
        ];
    }
}

I am on an open-source journey 🚀, and I wish I could solely focus on my development path without worrying about my financial situation. However, as life is not perfect, I have to consider other factors.

Therefore, if you decide to use my packages, please kindly consider making a donation. Any amount, no matter how small, goes a long way and is greatly appreciated. 🍺

Donate

License

This software is released under The MIT License (MIT).