Ako správne pracovať s cache
- Čamo
- Člen | 798
Zdravím,
včera som skúšal cachovať data a potreboval by som vysvetliť zopár
vecí.
Hlavne ma zaujíma správna inicializácia. Zatiaľ to mám takto a funguje:
<?php
namespace App\Presenters;
use Nette,
Nette\Caching\Cache;
/**
* Default presenter.
*/
class Drom1Presenter extends \App\Presenters\BasePresenter
{
/** @var Nette\Database\Context */
private $database;
/** @var Nette\Caching\IStorage @inject */
public $storage;
public function __construct(\Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault($id)
{
$cache = new Cache($this->storage);
$cache->save('test','testovacie data');
$this->template->cache = $cache->load('test');
}
}
Ja momentálne nechápem z kade som zobral tento inject(neni v ňom totiž ani adresár ani typ keše):
/** @var Nette\Caching\IStorage @inject */
public $storage;
Lebo skúšal som to už asi pre mesiacom, ale teraz neviem ako som k tomu
prišiel, lebo v dokumentácii je to inak. Tam treba uviesť typ keše a
adresár.
Tiež ma zaujíma, či sa to nedá používať bez toho use ako napr. databázu,
alebo dokonca session(ako metódu presentera).
Ďakujem.
Editoval Čamo (3. 7. 2014 8:33)
- hranicka
- Člen | 23
Do presenterů může injectovat závislosti DI container (https://doc.nette.org/…introduction , https://pla.nette.org/…ect-autowire) a můžeš to zapsat více způsoby:
property injection:
/**
* @var Nette\Caching\IStorage
* @inject
*/
public $storage;
nebo method injection:
/** @var Nette\Caching\IStorage */
private $storage;
public function injectStorage(Nette\Caching\IStorage $storage)
{
$this->storage = $storage;
}
a přes konstruktor v presenteru radši ne-e (https://phpfashion.com/…osti-v-nette + odkzazy ve spodní části článku).
Snad ses ptal na to, kde se vezme ten IStorage – dodá ho DI
container.
V configu se nadefinuje služba (vytvoří a nastaví instance třídy) a ta se
pak automaticky injectuje do další služeb/presenterů.
Editoval hranicka (3. 7. 2014 8:45)
- Čamo
- Člen | 798
Nie DI ako tak chápem(berte s rezervou).
1. Nechápem kde sa stratilo Filestorage(‚temp‘) ako je to
v dokumentácii.
$storage = new Nette\Caching\Storages\
FileStorage(‚temp‘);
Čo keby som chcel použiť MemoryStorage?
2. Nechápem prem prečo sa musí použiť use, prečo to
nieje bez ako pri injektovaní DB.
Editoval Čamo (3. 7. 2014 8:56)
- hranicka
- Člen | 23
IStorage
V Nette 2.2 se vytváří služba cacheStorage
(instance
IStorage) automaticky uvnitř Nette.
Když si tu službu nepředefinuješ, tak danou službou implementující
IStorage bude Nette\Caching\Storages\FileStorage
s nastaveným
adresářem pro dočasné soubory tak, jak nastavíš v bootstrap.php
$configurator = new Nette\Configurator;
$configurator->setTempDirectory('path/to/temp');
Implementační detail:
Ta služba se vytváří uvnitř
\Nette\Bridges\Framework\NetteExtension::setupCache
.
Použití ‚use‘
Nevím s čím je zde problém, to je záležitost jazyka http://php.net/…mporting.php
Editoval hranicka (3. 7. 2014 9:21)
- Čamo
- Člen | 798
Aha takže filestorage je default inak to treba prekonfigurovať. Akurát som
to našiel v tom DI a je to tak aj s tým temp adresárom.
To use v kontexte php chápem, len som myslel, že by to riešil ten DI
conteiner tak ako u DB(ak to tak je). Pri injektovaní DB sa use
nepoužíva.
Editoval Čamo (3. 7. 2014 10:07)