') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); [5.x] Custom file cache store adjustments by jasonvarga · Pull Request #10362 · statamic/cms · GitHub
Skip to content

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

Merged
jasonvarga merged 2 commits into
5.xfrom
cache-file-store-extension
Jun 24, 2024
Merged

[5.x] Custom file cache store adjustments#10362
jasonvarga merged 2 commits into
5.xfrom
cache-file-store-extension

Conversation

@jasonvarga

Copy link
Copy Markdown
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.xJun 24, 2024
@jasonvarga
jasonvarga deleted the cache-file-store-extension branch June 24, 2024 21:33
@cornevanpelt

cornevanpelt commented Jul 23, 2024

Copy link
Copy Markdown

@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
Copy Markdown
MemberAuthor

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

@cornevanpelt

cornevanpelt commented Jul 24, 2024

Copy link
Copy Markdown

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 freeto 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

@jasonvarga@cornevanpelt