1. Go to this page and download the library: Download foxws/laravel-modelcache library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
foxws / laravel-modelcache example snippets
use Foxws\ModelCache\Concerns\InteractsWithModelCache;
use Illuminate\Database\Eloquent\Model;
class Video extends Model
{
use InteractsWithModelCache;
}
$video = Video::findOrFail(5);
$video->modelCache('playback_position', 142);
// With a custom TTL
$video->modelCache('random_seed', 0.73, now()->addHours(6));
$video->modelCache('last_viewed', now(), 3600); // TTL as seconds
$position = $video->modelCached('playback_position'); // null if not cached
$seed = $video->modelCached('random_seed', 0.5); // 0.5 as fallback
if (! $video->modelCacheHas('playback_position')) {
$video->modelCache('playback_position', 0);
}
$video->modelCacheForget('playback_position');
// With a closure (recommended for expensive operations)
$stats = $video->modelCacheRemember('stats', fn() => $this->computeExpensiveStats($video), now()->addDay());
// With a plain value
$video->modelCacheRemember('random_seed', 0.73, now()->addHours(6));
class VideoController extends Controller
{
public function show(Video $video): JsonResponse
{
$stats = $video->modelCacheRemember('stats', fn() => $this->computeExpensiveStats($video), now()->addDay());
return response()->json($stats);
}
}
$seed = Video::getModelCache('random_seed'); // null if not cached
$seed = Video::getModelCache('random_seed', 0.5); // with fallback
if (! Video::hasModelCache('random_seed')) {
Video::setModelCache('random_seed', rand() / getrandmax());
}
Video::forgetModelCache('random_seed');
use Foxws\ModelCache\Facades\ModelCache;
class RecordPlaybackPosition
{
public function handle(Video $video, int $seconds): void
{
if (! ModelCache::enabled()) {
return;
}
if (! ModelCache::shouldCache($video, 'playback_position', $seconds)) {
return;
}
ModelCache::cache($video, 'playback_position', $seconds, now()->addDay());
}
}
// Read from cache
$position = ModelCache::getCachedValue($video, 'playback_position');
// Check
$exists = ModelCache::hasBeenCached($video, 'playback_position');
// Forget one or multiple keys
ModelCache::forget($video, 'playback_position');
ModelCache::forget($video, ['playback_position', 'random_seed']);
class Video extends Model
{
use InteractsWithModelCache;
public function shouldModelCache(string $key, mixed $value = null): bool
{
// Never cache a null value
if ($value === null) {
return false;
}
// Only cache specific keys
if (! in_array($key, ['playback_position', 'random_seed', 'stats'])) {
return false;
}
return true;
}
}
use Foxws\ModelCache\CacheProfiles\BaseCacheProfile;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
class AuthenticatedUserCacheProfile extends BaseCacheProfile
{
public function shouldUseCache(Model $model, string $key): bool
{
// Only cache for authenticated users
return Auth::check();
}
public function shouldCacheValue(mixed $value = null): bool
{
// Do not cache null or empty strings
return $value !== null && $value !== '';
}
}
class Video extends Model
{
use InteractsWithModelCache;
protected function cacheNameSuffix(string $key): string
{
// Shared cache regardless of who is logged in
return '';
}
}
class Post extends Model
{
use InteractsWithModelCache;
protected function cacheNameSuffix(string $key): string
{
// Separate cache per user
return Auth::check() ? (string) Auth::id() : '';
}
}
class Report extends Model
{
use InteractsWithModelCache;
protected function cacheNameSuffix(string $key): string
{
// Separate cache per key type, shared across users
return $key;
}
}