Nette Cache $container->getService(cacheStorage)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Čamo
Člen | 798
+
0
-

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

Musis injectnout Nette\Caching\IStorage, mrkni do meho cheatsheetu, snad pomuze :)

Čamo
Člen | 798
+
0
-

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');
David Matějka
Moderator | 6445
+
0
-

IStorage a ne Storage. A pouzivej radeji @inject anotace

Čamo
Člen | 798
+
0
-

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

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

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)

Čamo
Člen | 798
+
0
-

Ok díky moc!

Azathoth
Člen | 495
+
0
-

Nedoporučuje se používání $inject anotace náhodou pouze u abstraktních presenterů?
Neměla by se u konkrétních presenterů, které nejsou abstract, používat konstruktorová injekce?