Cachování v latte šabloně

Terka04
Člen | 44
+
0
-

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
+
+4
-

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
+
0
-

Děkuji za odpověď.

Zkusila jsem nahradit tvou ukázku tou mou a narazila jsem na několik problémů.

  1. 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.
  2. Když to dám private, tak mě to už pustí, avšak při dumpnutí je null.
  3. 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 | 1162
+
+3
-

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.

Terka04
Člen | 44
+
0
-

Díky moc kluci. Takhle mi to už funguje. Jste machři! ☺ Mám se co doučovat (DI).