Ako správne pracovať s cache

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

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

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

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

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

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)

Jan Suchánek
Člen | 404
+
0
-

Podle mě staré vlákno ale i tak celkem vpohodě je zde.