Cache – funguje jen z části

Klobás
Člen | 113
+
0
-

Ahoj,

hraju si s Nette\Cache a zjištuji, že mi funguje jen tak nějak napůl.
Funguje mi vytváření a mazání přes tagy, ale přes key (čili název tagu) se to nikdy nesmaže, proč?

Šablona presenteru

<?php

    {cache 'kes', expire => '10 minutes', tags => ['time', 'timecache']}
      {=time()}
    {/cache}
    <br>
    <a n:href="uncache! time">Smazání keše - 1 tag</a> <br>
    <a n:href="uncache! timecache">Smazání keše - 2 tag</a>
?>

Presenter

<?php
    private $cache;

    public function __construct(Nette\Caching\IStorage $storage)
    {
        $this->cache = new Cache($storage);
    }
?>

funkční handle pouze přes tagy

<?php
    public function handleUncache($tag)
    {

        $this->cache->clean(array(
            Cache::TAGS => array($tag),
        ));

    }

?>

nefunkční přes klíč, proč?

<?php

    public function handleUncache($tag)
    {

        // $this->cache->clean(array(
        //     Cache::TAGS => array($tag),
        // ));

        $this->cache->remove('kes');
    }

?>
David Matějka
Moderator | 6445
+
+2
-

ahoj, cache v sablone ma namespace Nette.Templating.Cache. A mazani/cteni pres klic je zavisle prave na namespace (narozdil od mazani pres tagy). kdyz tedy vytvaris tu cache, tak musis predat spravny NS

Klobás
Člen | 113
+
0
-

David Matějka napsal(a):

ahoj, cache v sablone ma namespace Nette.Templating.Cache. A mazani/cteni pres klic je zavisle prave na namespace (narozdil od mazani pres tagy). kdyz tedy vytvaris tu cache, tak musis predat spravny NS

a ten NS je tedy co konkrétně v mém Presenteru? NS Presenteru nebo co? Prosím o ukázku.

Ondřej Kubíček
Člen | 494
+
0
-

jak psal david, musíš při vytváření cache předat ten NS

public function __construct(Nette\Caching\IStorage $storage)
{
        $this->cache = new Cache($storage, "Nette.Templating.Cache");
}
Klobás
Člen | 113
+
0
-

Ondřej Kubíček napsal(a):

jak psal david, musíš při vytváření cache předat ten NS

public function __construct(Nette\Caching\IStorage $storage)
{
        $this->cache = new Cache($storage, "Nette.Templating.Cache");
}

Udělal jsem (poprvé jsem si přidal vlastní NS něco jako „testovaciNS“, poté tento váš, a stejně mi to neodkešuje :(
Nette 2.3 (po každé změně, jsem pro jistotu promazal celý obsah temp/); ale stejně se nic nezměnilo, funguguje to pořád blbě.

V čem může být zakopaný pes?

Editoval Klobás (9. 3. 2018 15:07)

David Matějka
Moderator | 6445
+
+2
-

hm, tak kdyz na to koukam poradne, tak ten klic se vytvari trochu sloziteji .. takze bude lepsi to mazat pres tag

Klobás
Člen | 113
+
0
-

David Matějka napsal(a):

hm, tak kdyz na to koukam poradne, tak ten klic se vytvari trochu sloziteji .. takze bude lepsi to mazat pres tag

Hmm, https://doc.nette.org/cs/caching#…

<?php

Položku z cache vymažeme uložením NULL, nebo metodou remove():

$cache->save($key, NULL);
// nebo
$cache->remove($key);

?>

Tak v tom případě, je tohle zavádějící nebo neotestované nebo nevím, jako OK, můžu si vždy uložit tag pod stejným názvem jako klíč, ale …

Navíc pod tím, je ukázka, že si mohu NS pojmenovat jak chci.

Jsem z toho volako volako zmetený.

Editoval Klobás (9. 3. 2018 15:33)

Klobás
Člen | 113
+
0
-

Hm, pokud si to zakešuji v presenteru rovnou, tak mazání přes klíč funguje korektně.
A nastavil jsem si i jiný NS a správně to vytvořilo složku v tempu _Test123

Takže, je nějaký problém když se kešuje přes makro {cache}

<?php
 $this->cache = new Cache($storage, 'Test123');
?>
<?php
        $this->template->kes2 = $this->cache->load('kes2');

        if ($this->template->kes2 === NULL)
        {

            $this->cache->save('kes2', $this->template->kes2 = date('H:i:s'));
        }
?>
Felix
Nette Core | 1183
+
+2
-

Vytvareni cache v sablone trochu slozitejsi, to se snazil @matej21 popsat. Jednoduche mazani pres name tedy nefunguje.

V dokumentaci je to popsane obecne pro pouziti Cache, ale ne pro cache v sablone. To bychom mohli doplnit.

Klobás
Člen | 113
+
0
-

Felix napsal(a):

Vytvareni cache v sablone trochu slozitejsi, to se snazil @matej21 popsat. Jednoduche mazani pres name tedy nefunguje.

V dokumentaci je to popsane obecne pro pouziti Cache, ale ne pro cache v sablone. To bychom mohli doplnit.

Prosím o to, protože na základě tohohle cvičení a stejných postupů s tím rozdílem, že jednou v šabloně, podruhé z presenteru, jsem pomalu nabyl dojmu, že se jedná o BUG.

Děkuji.

David Grudl
Nette Core | 8082
+
0
-

Možná by mohlo fungovat $this->cache->remove(['kes']);

Klobás
Člen | 113
+
0
-

David Grudl napsal(a):

Možná by mohlo fungovat $this->cache->remove(['kes']);

Mohlo, ale bohužel. Nějak chápu, proč to asi nefunguje, ale dopíšete to prosím do dokumentace?

Ještě se zeptám, existuje nějaký github nebo live-list kde můžu sledovat co se kde v dokumentaci změní za text, abych byl neustále v obraze? (Nezajímá mě kód nebo PR do Nette, ale skutečně jen obsahová část dokumentace). (Celý web včetně všech sekcí Nette 2.1 – 2.4).

Klobás
Člen | 113
+
0
-

Matey napsal(a):

http://nette-commits.cz/docs

Děkuji.