Expirace cache ve stanovené datum, když je potřeba získání datumu zacachovat
- Milanov
- Člen | 51
Ahoj. Mám v šabloně zacachovaný kus kódy a vím datum, kdy je potřeba cache invalidovat. Problém je, že získat si to datum znamená komplikovaný výpočet a kdesicosi přes databázi, takže bych potřeboval ideálně zacachovat i to získání datumu.
Je možné např. expire cache nastavit uvnitř makra? Třeba nějak takto?
{cache key, tags => [...]}
{cacheExpire $item->getDateTime()}
.....
{/cache}
Nebo mě ještě napadlo řešení:
{cache key}
{cache key, tags => [...], expire => $item->getDateTime()}
.....
{/cache}
{/cache}
Nebo nějak úplně jinak? Díky
- Jan Endel
- Člen | 1016
tyhle věci imho do šablony přímo nepatří, což takhle mít na to service:
class ExpireChecker
{
public function getExpireDate
{
if ($this->datum_je_v_cachi) {
return $this->datum
} else {
$this->datum = $this->slozity_vypocet_data
return $this->datum;
}
}
}
no a v presenteru:
public function renderDefault
{
$this->template–>expireDate = $this->service->getExpireDate();
}
a v šabloně:
{cache 'expire' => $expireDate}
- Milanov
- Člen | 51
Právě testuji druhou možnost a jsem docela nadšený. Udělal jsem toto:
{cache key}
{cache key, tags => $item->getTags(), expire => $item->getDateTime()}
.....
{/cache}
{/cache}
Řešení má za následek, že první načtení pracně spočítá tagy (u nás to jsou tagy navazujících entit, nebo kolekcí entit) a datum (opět se získává z databáze, konkrétně jde o datum konce platnosti přiřazené akce). Druhé načtení již ani tagy, ani datum nepočítá, jenom si šáhne přímo do cache. Jedině je nutné získat závislosti pro klíč a ty mít v obou cachích stejné. Ale to musí být vždy.
Kdyby takto interně makro pracovalo automaticky, bylo by to super. Problém je jen ten, že se data ukládají do cache 2×.
Editoval Milanov (15. 5. 2015 21:56)
- Svaťa Šimara
- Člen | 98
Cache v Latte nově podporuje tzv. dependencies:
<?php
{cache key, dependencies => $createDependencies()}
...
{/cache}
?>
A v presenteru/komponentě šabloně řekneš, co že to
createDependencies
má vlastně dělat:
<?php
public function render() { //nebo renderXXX
$this->template->createDependencies = function() {
$item = $this->getItem();
return ['tags' => $item->getTags(), 'expire' => $item->getDateTime()];
}
}
?>
Finta je v tom, že ona funkce vracející tagy a expiraci je volána pouze
při vytváření cache.
A do té funkce createDependencies
může jít klidně
ID itemu:
<?php
{cache key, dependencies => $createDependencies($id)}
...
{/cache}
...
$this->template->createDependencies = function($id) {
$item = $this->getItem($id);....
}
?>
Pokud sem to vysvětlil nepochpitelně, tady je test: https://github.com/…teCache.phpt#…