Latte / Cache / více jazyků
- Blonďák
- Člen | 11
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
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
V konstruktoru nemusíš definovat prefix, když tam s ním nic neděláš.
V té metodě remove to voláš se správným parametrem?