Latte / Cache / více jazyků

Blonďák
Člen | 11
+
0
-

Ahoj,
mám takový problém a nevím, kde začít

mám aplikaci, která běží na více doménách a podle domény se nastavuje locale atp, podle domény se také načte např menu z databáze, v šablonách (které jsou stejné pro všechny domény) používám n:cache (bez identifikátoru domény/locale), teď jsem narazil na problém s tím, že např pokud nejdříve otevřu SK verzi, tak se z DB načte menu a uloží se do cache, takže když potom otevřu CZ verzi, tak mám „slovenské“ menu.

Dotaz tedy zní, kde začít hledat „chybu“, případně, zda se dá někde přidat globální namespace (třeba přidáním Nette\Caching\Cache::derive) tak, abych to mohl přidat jednou a nemusel opravovat všechny použití cache.

Blonďák
Člen | 11
+
0
-

No v kódu to samo přidat můžu (v latte bych musel přidávat identifikátor do klíče), nicméně, pokud bych na to někde zapomněl, tak by to byl problém a mixovali by se data z různých domén, proto mě napadlo, zda by se nedal nějak udělat globální prefix namespace.

Blonďák
Člen | 11
+
0
-

teď mě napadlo udělat si „prefixed“ storage a to nastavit jako storage (pod tím bude klasické storage), jenom bude ke klíčům přidávat prefixy.

Blonďák
Člen | 11
+
+2
-

tak to vypadá, že to funguje, pokud by to někomu pomohlo, používám to zhruba takto

namespace Blondak\Cache\Storage;

use Nette\Caching\IStorage;
use Nette\SmartObject;

class PrefixedStorage implements IStorage
{
    use SmartObject;

    private $underLyingStorage;

    private $prefix;

    public function __construct(IStorage $underLyingStorage, $prefix = null)
    {
        $this->underLyingStorage = $underLyingStorage;
		$this->setPrefix($prefix);
    }

    public function setPrefix($prefix = null)
    {
        if ($prefix){
            $this->prefix = $prefix.\Nette\Caching\Cache::NAMESPACE_SEPARATOR;
        } else {
            $this->prefix = NULL;
        }
        return $this;
    }

    /**
     * Generates internal cache key.
     * @param  mixed  $key
     * @return string
     */
    protected function generateKey($key)
    {
        if ($this->prefix){
            return $this->prefix . $key;
        }
        return $key;
    }

    public function read($key)
    {
        return $this->underLyingStorage->read($this->generateKey($key));
    }

    public function lock($key)
    {
        return $this->underLyingStorage->lock($this->generateKey($key));
    }

    public function clean(array $conditions)
    {
        return $this->underLyingStorage->clean($conditions);
    }

    public function write($key, $data, array $dependencies)
    {
        return $this->underLyingStorage->write($this->generateKey($key), $data, $dependencies);
    }

    public function remove($key)
    {
        return $this->underLyingStorage->remove($this->generateKey($key));
    }

}
    prefixedStorage:
        autowired: false
        class: Blondak\Cache\Storage\PrefixedStorage
        setup:
            - "$service->setPrefix(?->domain->url)"(@DomainService)

    latte.templateFactory:
        arguments:
            cacheStorage: @prefixedStorage

Editoval Blonďák (9. 9. 2021 13:44)

Michal Kumžák
Člen | 106
+
0
-

V konstruktoru nemusíš definovat prefix, když tam s ním nic neděláš.

V té metodě remove to voláš se správným parametrem?

Blonďák
Člen | 11
+
0
-

Díky za postřeh, trochu jsem to dolaďoval a měl circular reference, tak jsem to upravoval a pak to dopadlo takto ;)

Blonďák
Člen | 11
+
0
-

Nicméně, vypadá to že to funguje, ale je to takto správně, nebo by se to mělo řešit nějak jinak?