Nette Cache $container->getService(cacheStorage)
- Čamo
- Člen | 798
Tak som začal experimentovať s cache v Nette.
A napísal som do presenteru
use Nette\Caching\Cache
...
$cache = new Cache($container->getService('cacheStorage'), 'myCache');
$cache->save('myStorage','Toto som si uložil do mojej Cache');
$this->template->myCache = $cache->load('myCache');
No a ako iste tušíte Ladenka má problém: Undefined variable: container
Môže mi niekto prosím vysvetliť, ako sa takéto veci správne riešia?
Asi je problém v tom, že ešte nechápem všetky tie vnútorné
vzťahy(služby/injektovanie/…) Priznávam som z toho somár.
Ďakujem za pozornosť.
Editoval Čamo (13. 5. 2014 14:47)
- David Matějka
- Moderator | 6445
Musis injectnout Nette\Caching\IStorage
, mrkni do meho cheatsheetu, snad
pomuze :)
- Čamo
- Člen | 798
Stále nič…
Pozrite sa ako to píšem a povedzte mi čo robím zle:
<?php
namespace App\Presenters;
use Nette, App\Model, Nette\Caching\Cache, Nette\Diagnostics\Debugger;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context */
private $database;
/** @var Nette\Caching\Storage */
public $storage;
public function __construct(Nette\Database\Context $database, Nette\Caching\Storage $storage)
{
$this->database = $database;
$this->storage = $database;
}
public function renderDefault()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC')
->limit(10);
$cache = new Cache($this->storage);
$cache->save('myCache','Toto som si uložil do mojej Cache');
$this->template->myCache = $cache->load('myCache');
- Čamo
- Člen | 798
Ok už to funguje.
Ale ešte by ma zaujímalo, prečo sa v tom mojom kóde(čo som skopíroval
z quickstartu)neinjektuje aj databázové spojenie. Prečo sa v tom prípade
dáva do konštruktora ten type hinting. Lebo v tom cheatcheete je ten type
hinting uvedený ako jedna z možností injektovania. Ale keď som to prepísal
do podoby /* @var $database Nette\Database\Context @inject */ tak
to nefungovalo. Aký je v tom rozdiel?
Mám v tom značný chaos.
Editoval Čamo (14. 5. 2014 8:44)
- Jan Endel
- Člen | 1016
Obecně se anotace @inject
doporučuje pouze
v presenterech, všude jinde je doporučováno předávání závislostí skrze
konstruktor. Zároveň je potřeba zdůraznit, že anotace @inject
funguje pouze na public propertynách (teď si nejsem jistý, možná i na
protected, ale určitě ne na private).
- David Matějka
- Moderator | 6445
j, property musi byt
public a musis (alespon ve stable nette, v dev uz ne, tam se respektujou
importy) pouzivat FQN (radeji vcetne pocatecniho \
), takze
/** @var \Nette\Database\Context @inject */
public $database;
Editoval matej21 (13. 5. 2014 18:08)