Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5.x] Custom file cache store adjustments #10362

Merged
merged 2 commits into from
Jun 24, 2024
Merged

Conversation

jasonvarga
Copy link
Member

We have a customized file driver for the cache that will organize any Stache related keys into a simplified file structure for ease of debugging.

This would only affect your default cache store.

This PR changes it so that any store using the file driver will be changed to use our custom version. This is useful along with #10303.

We are newing up the FileStore identically to how Laravel does it now which would also fix custom lock_path not working.

Additionally, this PR avoids a nested stache directory if you point your cache store to a directory already named stache.

The cache driver named statamic is now deprecated in favor of just using file.

@jasonvarga jasonvarga merged commit 1252b7a into 5.x Jun 24, 2024
18 checks passed
@jasonvarga jasonvarga deleted the cache-file-store-extension branch June 24, 2024 21:33
@cornevanpelt
Copy link

cornevanpelt commented Jul 23, 2024

@jasonvarga This change causes problems for us, it breaks our current implementation of file based taggable cache for which we have extended the standard "file" driver (using swayok/alternative-laravel-cache). With this change in Statamic, extending the "file" driver no longer seems possible since Statamic takes over the file driver itself.

It was a lot easier when you used your own "statamic" driver for the Stache and we could do anything we liked to the file driver.

So the question is: How can we now apply our own extensions to the "file" driver? Do you have any ideas on how to work around this or will there be a future update that makes this possible again?

@jasonvarga
Copy link
Member Author

Can you show how you're overriding/extending the file driver so we can make sure we fix it properly?

@cornevanpelt
Copy link

cornevanpelt commented Jul 24, 2024

Thanks for your swift reply! Yes of course I can explain in some more detail, any ideas or help on this one is very welcome!

We are binding "taggable-cache" to the service container in the register() method of one of our service providers, like this:

// Register the binding on the Service Container
$this->app->bind('taggable-cache', function() {
    /** @var AlternativeFileCacheStoreWithLocks $store */
    $store = app('cache')->store('file');

    return $store;
});

This should return the "file" cache store that the "swayok/alternative-laravel-cache" composer package provides, because inside that package (thus out of my control) there's this method that overrides the "file" cache driver to use its store:

protected function addFileCacheDriver(CacheManager $cacheManager, bool $hasLocks): void
{
    $provider = $this;

    $cacheManager->extend(
        $this->fileDriverName,
        function (Application $app, array $cacheConfig) use ($hasLocks, $provider, $cacheManager) {
            $db = new Filesystem($provider->makeFileCacheAdapter($cacheConfig));
            if ($hasLocks) {
                $store = new AlternativeFileCacheStoreWithLocks($db, $provider->getPrefix($cacheConfig));
            } else {
                $store = new AlternativeFileCacheStore($db, $provider->getPrefix($cacheConfig));
            }
            $store->setLogger($app->make('log'));

            return $cacheManager->repository($store, $cacheConfig);
        }
    );
}

Unfortunately, the "fileDriverName" is hardcoded within the package and is set to "file":

protected $fileDriverName = 'file';

In Statamic 5.10.0 all works well, but when upgrading to 5.11.0 it fails because we will now get back the Statamic "file" cache store instead of the AlternativeFileCacheStoreWithLocks store when using the "taggable-cache" (through a facade).

So, I'm kinda stuck here, because both Statamic and this composer package now try to take control over the "file" cache driver and there doesn't seem to be an easy way to get them both working together. However, I need them both because our site is build in Statamic and we also have a lot depending on taggable cache (which out-of-the-box doesn't work well in Laravel, so we need this composer package for a proper implementation).

Any ideas are welcome, I haven't been able to come up with a simple work-around or proper solution for this yet...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants