Cachování v latte šabloně
- Terka04
- Člen | 44
Dobrý den,
začala jsem používat cache, ale narazila jsem na problém a v dokumentaci
jsem nenašla odpověď. :/
Mám nastaveno:
<?php
declare(strict_types=1);
namespace App\Presenters;
use Nette\Caching\Cache;
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
// Cache
public $cache;
public $cache_storage;
public function startup() {
parent::startup();
$this->cache_storage = new Nette\Caching\Storages\FileStorage(TEMP_DIR.'/cache');
$this->cache = new Cache($this->cache_storage);
}
}
TEMP_DIR odkazuje do /temp.
Při použití cache v Presenterech jede vše v pohodě. Jak save, load, tak i delete. Ale při použití v šabloně se mi nikam nic neuloží. Cache ukládám pod klíčem a zpětným dotazem na existující klíč mi to vrátí null.
$this->template->key = $key = "test123";
dump($this->cache->load($key)); // Vrací null
{cache $key, expire => '60 days'}
--- něco, co potřebuji cachovat ---
{/cache}
Nevíte někdo, v čem by mohl být zakopaný pes? :)
Editoval Terka04 (6. 9. 2021 8:14)
- h4kuna
- Backer | 740
Tím že si keš instancuješ v presenteru a nevyužíváš Nette\DI, tak bych tipl, že máš dvě instance keše.
Tu v presenteru zruš a nech si ji injektnout pomocí Nette\DI.
Tvoji ukázku, plně nahraď tímhle, lze ji zapsat lépe pro novější Nette a php, ale detaily nemám, takže jsem to napsal co nejvíce kompatibilní:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/**
* @var Nette\Caching\Cache
* @inject
*/
public $cache;
}
Keš je v základu nějak nastavená, když ti funguje v šabloně. Jak se konfiguruje zkus dohledat.
Edit:
Pokud ji v neonu nemáš, je potřeba přidat službu keše
services:
- Nette\Caching\Cache
Editoval h4kuna (9. 9. 2021 11:02)
- Terka04
- Člen | 44
Děkuji za odpověď.
Zkusila jsem nahradit tvou ukázku tou mou a narazila jsem na několik problémů.
- Když dám public $cache, vyskočí na mě chyba: „Service of type Nette\Caching\Cache required by App\Presenters\BasePresenter::$cache not found. Did you add it to configuration file?“ V konfigu už ale netuším, co nacvakat – v dokumentaci jsem nenašla.
- Když to dám private, tak mě to už pustí, avšak při dumpnutí je null.
- Ráda bych použila FileStorage, avšak z dokumentace jsem pochopila, že lze použít pouze při nové instanci – v configu se nanastavuje.
Něco mi uniká, nebo přehlížím. :/ Mohu ještě poprosit o nakopnutí?
- Marek Bartoš
- Nette Blogger | 1280
1. Přidej si toto do konfigurace. Nette má by default v DI jen
Nette\Caching\IStorage
a očekává, že si z něj
Nette\Caching\Cache
vytvoříš sama
services:
- Nette\Caching\Cache
2. @inject
funguje pouze pro public properties, nette di tvou
private property vůbec nenajde. Pokud používáš jako IDE phpstorm, tak
existuje plugin pro nette, který by ti toto nahlásil.
3. FileStorage je výchozí implementace interface
Nette\Caching\IStorage
a už bys ji měla mít dostupnou v DI
kontejneru. Eventuálně si můžeš v property se @inject
vyžádat IStorage
a přeskočit bod 1.