diff --git a/config/stache.php b/config/stache.php index 7fc91d77b1..2d2ec830d3 100644 --- a/config/stache.php +++ b/config/stache.php @@ -17,6 +17,17 @@ 'watcher' => env('STATAMIC_STACHE_WATCHER', 'auto'), + /* + |-------------------------------------------------------------------------- + | Cache Store + |-------------------------------------------------------------------------- + | + | Here you may configure which Cache Store the Stache uses. + | + */ + + 'cache_store' => null, + /* |-------------------------------------------------------------------------- | Stores diff --git a/src/Facades/Stache.php b/src/Facades/Stache.php index a401fc80c3..fe75a1856e 100644 --- a/src/Facades/Stache.php +++ b/src/Facades/Stache.php @@ -11,6 +11,7 @@ * @method static self registerStores($stores) * @method static mixed stores() * @method static mixed store($key) + * @method static \Illuminate\Contracts\Cache\Store cacheStore() * @method static string generateId() * @method static self clear() * @method static void refresh() diff --git a/src/Stache/Duplicates.php b/src/Stache/Duplicates.php index c22fcdb062..3d950d87b2 100644 --- a/src/Stache/Duplicates.php +++ b/src/Stache/Duplicates.php @@ -2,7 +2,6 @@ namespace Statamic\Stache; -use Illuminate\Support\Facades\Cache; use Statamic\Stache\Stores\AggregateStore; use Statamic\Stache\Stores\Store; @@ -49,19 +48,19 @@ public function cache() return; } - Cache::forever('stache::duplicates', $this->items); + $this->stache->cacheStore()->forever('stache::duplicates', $this->items); } public function load() { - $this->items = Cache::get('stache::duplicates', []); + $this->items = $this->stache->cacheStore()->get('stache::duplicates', []); return $this; } public function clear() { - Cache::forget('stache::duplicates'); + $this->stache->cacheStore()->forget('stache::duplicates'); return $this; } diff --git a/src/Stache/Indexes/Index.php b/src/Stache/Indexes/Index.php index 0375a92814..00f41b19da 100644 --- a/src/Stache/Indexes/Index.php +++ b/src/Stache/Indexes/Index.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Indexes; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\Stache; use Statamic\Statamic; @@ -76,7 +75,7 @@ public function load() debugbar()->addMessage("Loading index: {$this->store->key()}/{$this->name}", 'stache'); - $this->items = Cache::get($this->cacheKey()); + $this->items = Stache::cacheStore()->get($this->cacheKey()); if ($this->items === null) { $this->update(); @@ -106,12 +105,12 @@ public function update() public function isCached() { - return Cache::has($this->cacheKey()); + return Stache::cacheStore()->has($this->cacheKey()); } public function cache() { - Cache::forever($this->cacheKey(), $this->items); + Stache::cacheStore()->forever($this->cacheKey(), $this->items); } public function updateItem($item) @@ -153,7 +152,7 @@ public function clear() $this->loaded = false; $this->items = null; - Cache::forget($this->cacheKey()); + Stache::cacheStore()->forget($this->cacheKey()); } public static function currentlyLoading() diff --git a/src/Stache/Stache.php b/src/Stache/Stache.php index ba9684da05..6c098ac865 100644 --- a/src/Stache/Stache.php +++ b/src/Stache/Stache.php @@ -63,6 +63,11 @@ public function stores() return $this->stores; } + public function cacheStore() + { + return Cache::store(config('statamic.stache.cache_store')); + } + public function store($key) { if (Str::contains($key, '::')) { @@ -85,7 +90,7 @@ public function clear() $this->duplicates()->clear(); - Cache::forget('stache::timing'); + $this->cacheStore()->forget('stache::timing'); return $this; } @@ -146,7 +151,7 @@ public function stopTimer() return $this; } - Cache::forever('stache::timing', [ + $this->cacheStore()->forever('stache::timing', [ 'time' => floor((microtime(true) - $this->startTime) * 1000), 'date' => Carbon::now()->timestamp, ]); @@ -156,12 +161,12 @@ public function stopTimer() public function buildTime() { - return Cache::get('stache::timing')['time'] ?? null; + return $this->cacheStore()->get('stache::timing')['time'] ?? null; } public function buildDate() { - if (! $cache = Cache::get('stache::timing')) { + if (! $cache = $this->cacheStore()->get('stache::timing')) { return null; } diff --git a/src/Stache/Stores/BasicStore.php b/src/Stache/Stores/BasicStore.php index 96c9926b06..b0af2fd90f 100644 --- a/src/Stache/Stores/BasicStore.php +++ b/src/Stache/Stores/BasicStore.php @@ -2,8 +2,8 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\File; +use Statamic\Facades\Stache; use Symfony\Component\Finder\SplFileInfo; abstract class BasicStore extends Store @@ -77,7 +77,7 @@ protected function getCachedItem($key) { $cacheKey = $this->getItemCacheKey($key); - return Cache::get($cacheKey); + return Stache::cacheStore()->get($cacheKey); } protected function cacheItem($item) @@ -86,12 +86,12 @@ protected function cacheItem($item) $cacheKey = $this->getItemCacheKey($key); - Cache::forever($cacheKey, $item); + Stache::cacheStore()->forever($cacheKey, $item); } public function forgetItem($key) { - Cache::forget($this->getItemCacheKey($key)); + Stache::cacheStore()->forget($this->getItemCacheKey($key)); } protected function getItemCacheKey($key) diff --git a/src/Stache/Stores/CollectionEntriesStore.php b/src/Stache/Stores/CollectionEntriesStore.php index b045e214c7..a00d70eaaa 100644 --- a/src/Stache/Stores/CollectionEntriesStore.php +++ b/src/Stache/Stores/CollectionEntriesStore.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Entries\GetDateFromPath; use Statamic\Entries\GetSlugFromPath; use Statamic\Entries\GetSuffixFromPath; @@ -13,6 +12,7 @@ use Statamic\Facades\File; use Statamic\Facades\Path; use Statamic\Facades\Site; +use Statamic\Facades\Stache; use Statamic\Facades\YAML; use Statamic\Stache\Indexes; use Statamic\Stache\Indexes\Index; @@ -230,7 +230,7 @@ protected function getCachedItem($key) { $cacheKey = $this->getItemCacheKey($key); - if (! $entry = Cache::get($cacheKey)) { + if (! $entry = Stache::cacheStore()->get($cacheKey)) { return null; } diff --git a/src/Stache/Stores/ContainerAssetsStore.php b/src/Stache/Stores/ContainerAssetsStore.php index c8650dbaea..680be56545 100644 --- a/src/Stache/Stores/ContainerAssetsStore.php +++ b/src/Stache/Stores/ContainerAssetsStore.php @@ -2,7 +2,6 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; use Statamic\Facades\AssetContainer; use Statamic\Facades\Stache; use Statamic\Statamic; @@ -59,7 +58,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } diff --git a/src/Stache/Stores/Keys.php b/src/Stache/Stores/Keys.php index 9a1cb2ee05..ce7edfd6ee 100644 --- a/src/Stache/Stores/Keys.php +++ b/src/Stache/Stores/Keys.php @@ -2,7 +2,7 @@ namespace Statamic\Stache\Stores; -use Illuminate\Support\Facades\Cache; +use Statamic\Facades\Stache; use Statamic\Stache\Exceptions\DuplicateKeyException; class Keys @@ -17,19 +17,19 @@ public function __construct(Store $store) public function load() { - $this->keys = Cache::get($this->cacheKey(), []); + $this->keys = Stache::cacheStore()->get($this->cacheKey(), []); return $this; } public function cache() { - Cache::forever($this->cacheKey(), $this->keys); + Stache::cacheStore()->forever($this->cacheKey(), $this->keys); } public function clear() { - Cache::forget($this->cacheKey()); + Stache::cacheStore()->forget($this->cacheKey()); } private function cacheKey() diff --git a/src/Stache/Stores/Store.php b/src/Stache/Stores/Store.php index d630c5596d..a264b13e46 100644 --- a/src/Stache/Stores/Store.php +++ b/src/Stache/Stores/Store.php @@ -97,7 +97,7 @@ public function indexUsage() { $key = $this->indexUsageCacheKey(); - return $this->usedIndexes = $this->usedIndexes ?? collect(Cache::get($key, [])); + return $this->usedIndexes = $this->usedIndexes ?? collect(Stache::cacheStore()->get($key, [])); } public function cacheIndexUsage($index) @@ -116,7 +116,7 @@ public function cacheIndexUsage($index) $this->usedIndexes = $indexes; - Cache::put($this->indexUsageCacheKey(), $indexes->all()); + Stache::cacheStore()->put($this->indexUsageCacheKey(), $indexes->all()); } protected function indexUsageCacheKey() @@ -180,14 +180,14 @@ public function handleFileChanges() // Get the existing files and timestamps from the cache. $cacheKey = "stache::timestamps::{$this->key()}"; - $existing = collect(Cache::get($cacheKey, [])); + $existing = collect(Stache::cacheStore()->get($cacheKey, [])); // Get the files and timestamps from the filesystem right now. $files = Traverser::filter([$this, 'getItemFilter'])->traverse($this); // Cache the files and timestamps, ready for comparisons on the next request. // We'll do it now since there are multiple early returns coming up. - Cache::forever($cacheKey, $files->all()); + Stache::cacheStore()->forever($cacheKey, $files->all()); // If there are no existing file timestamps in the cache, there's nothing to update. if ($existing->isEmpty()) { @@ -291,7 +291,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } @@ -351,7 +351,7 @@ protected function setPath($key, $path) protected function cachePaths($paths) { - Cache::forever($this->pathsCacheKey(), $paths->all()); + Stache::cacheStore()->forever($this->pathsCacheKey(), $paths->all()); $this->paths = $paths; @@ -361,7 +361,7 @@ protected function cachePaths($paths) public function clearCachedPaths() { $this->paths = null; - Cache::forget($this->pathsCacheKey()); + Stache::cacheStore()->forget($this->pathsCacheKey()); } protected function pathsCacheKey() @@ -381,13 +381,13 @@ public function clear() }); $this->usedIndexes = collect(); - Cache::forget($this->indexUsageCacheKey()); + Stache::cacheStore()->forget($this->indexUsageCacheKey()); $this->clearCachedPaths(); $this->keys()->clear(); - Cache::forget("stache::timestamps::{$this->key()}"); + Stache::cacheStore()->forget("stache::timestamps::{$this->key()}"); } public function warm() diff --git a/src/Stache/Stores/TaxonomyTermsStore.php b/src/Stache/Stores/TaxonomyTermsStore.php index d78837d3e6..1d3081d0af 100644 --- a/src/Stache/Stores/TaxonomyTermsStore.php +++ b/src/Stache/Stores/TaxonomyTermsStore.php @@ -3,7 +3,6 @@ namespace Statamic\Stache\Stores; use Facades\Statamic\Stache\Traverser; -use Illuminate\Support\Facades\Cache; use Statamic\Entries\GetSlugFromPath; use Statamic\Facades\File; use Statamic\Facades\Stache; @@ -151,7 +150,7 @@ public function paths() return $this->paths; } - if ($paths = Cache::get($this->pathsCacheKey())) { + if ($paths = Stache::cacheStore()->get($this->pathsCacheKey())) { return $this->paths = collect($paths); } diff --git a/tests/Stache/DuplicatesTest.php b/tests/Stache/DuplicatesTest.php index 6ecc98c437..3d36767162 100644 --- a/tests/Stache/DuplicatesTest.php +++ b/tests/Stache/DuplicatesTest.php @@ -111,6 +111,7 @@ public function it_saves_to_the_cache() $stache = $this->mock(Stache::class); $stache->shouldReceive('store')->with('test-store')->andReturn($store); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); $duplicates = new Duplicates($stache); @@ -146,7 +147,9 @@ public function it_loads_from_cache() { Cache::forever('stache::duplicates', ['foo' => 'bar']); - $duplicates = new Duplicates($this->mock(Stache::class)); + $stache = $this->mock(Stache::class); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); + $duplicates = new Duplicates($stache); $return = $duplicates->load(); @@ -159,7 +162,9 @@ public function it_clears_the_cache() { Cache::forever('stache::duplicates', ['foo' => 'bar']); - $duplicates = new Duplicates($this->mock(Stache::class)); + $stache = $this->mock(Stache::class); + $stache->shouldReceive('cacheStore')->andReturn(Cache::store()); + $duplicates = new Duplicates($stache); $this->assertNotNull(Cache::get('stache::duplicates')); diff --git a/tests/Stache/Stores/AssetContainersStoreTest.php b/tests/Stache/Stores/AssetContainersStoreTest.php index 8bab62bfdc..8530ddc4db 100644 --- a/tests/Stache/Stores/AssetContainersStoreTest.php +++ b/tests/Stache/Stores/AssetContainersStoreTest.php @@ -4,6 +4,7 @@ use Facades\Statamic\Stache\Traverser; use Illuminate\Filesystem\Filesystem; +use Illuminate\Support\Facades\Cache; use PHPUnit\Framework\Attributes\Test; use Statamic\Assets\Asset; use Statamic\Contracts\Assets\AssetContainer; @@ -115,6 +116,7 @@ public function it_saves_to_disk() Facades\Stache::shouldReceive('duplicates')->andReturn(optional()); Facades\Stache::shouldReceive('store')->with('users')->andReturn((new UsersStore((new Stache)->sites(['en']), app('files')))->directory($this->tempDir)); Facades\Stache::shouldReceive('isWatcherEnabled')->andReturnTrue(); + Facades\Stache::shouldReceive('cacheStore')->andReturn(Cache::store()); $container = Facades\AssetContainer::make('new') ->title('New Container'); diff --git a/tests/Stache/Stores/KeysTest.php b/tests/Stache/Stores/KeysTest.php index d9434cde7d..542c68e86c 100644 --- a/tests/Stache/Stores/KeysTest.php +++ b/tests/Stache/Stores/KeysTest.php @@ -67,6 +67,28 @@ public function it_saves_to_the_cache() $this->assertEquals(['foo' => 'bar'], Cache::get('stache::keys/test-store')); } + #[Test] + public function it_can_use_a_different_cache_store() + { + config()->set('statamic.stache.cache_store', 'stache'); + config()->set('cache.stores.stache', [ + 'driver' => 'array', + ]); + + $store = $this->mock(Store::class); + $store->shouldReceive('key')->andReturn('test-store'); + + $keys = (new Keys($store))->setKeys(['foo' => 'bar']); + + $this->assertNull(Cache::get('stache::keys/test-store')); + $this->assertNull(Cache::store('stache')->get('stache::keys/test-store')); + + $keys->cache(); + + $this->assertNull(Cache::get('stache::keys/test-store')); + $this->assertEquals(['foo' => 'bar'], Cache::store('stache')->get('stache::keys/test-store')); + } + #[Test] public function it_loads_from_cache() {