Vlastní CacheStorage (i pro RobotLoader)

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

V aplikaci běžící na Nette 0.9 mám vlastní implementaci ICacheStorage (APCStorage), kterou používám pro ukládání svých dat. Chtěl jsem ji zaregistrovat jako službu Nette\ServiceLocatoru, aby se používala i pro kešování v RobotLoaderu a pro Latte šablony.

Přidal jsem do config.ini tento řádek:

service.Nette-Caching-ICacheStorage = APCStorage

Při kontrolním výpisu při startu aplikace je v ServiceLocatoru načtena správná hodnota:

"nette\caching\icachestorage" => array(3) [
    0 => "APCStorage" (29)
    1 => TRUE
    2 => NULL
]

Problém je, že RobotLoader si zřejmě při startu aplikace chce uložit data do mé storage, kterou ale ještě nenalezl. Pokud zapnu laděnku, dostanu tuto chybu:

Nette\AmbiguousServiceException
Cannot instantiate service 'Nette\Caching\ICacheStorage', class 'APCStorage' not found.

Poradíte někdo, co s tím? Jak mám správně zaregistrovat cache storage, aby ji respektoval a správně použil i RobotLoader? Předem díky.

Editoval Pavel S. (9. 7. 2012 17:57)

JuniorJR
Člen | 181
+
0
-

Hádal bych, že chyba je popsána jasně

class ‚APCStorage‘ not found

llook
Člen | 407
+
0
-

Před registrací RobotLoadera použij require_once na tu tvoji třídu.

Pavel S.
Člen | 24
+
0
-

llook napsal(a):

Před registrací RobotLoadera použij require_once na tu tvoji třídu.

Díky, pomohlo. Ještě teď řeším, že mou cache nepoužívá šablonovací systém, i když je zaregistrovaná v configu. Víte někdo, co s tím? Kde se nastavuje, která cache se bude používat na ukládání šablon?

Filip Procházka
Moderator | 4668
+
0
-

Dúrazně nedoporučuji měnit cache pro šablony. Velice důrazně.

Nic tím nezískáš, jen problémy. Věř mi.

Editoval HosipLan (10. 7. 2012 11:10)

Pavel S.
Člen | 24
+
0
-

Dobře, díky za radu, nechám to takhle. Jen bych rád věděl, proč je to tak nebezpečné?

Filip Procházka
Moderator | 4668
+
0
-

Ani né nebezpečné, ale nevýhodné. PhpFileStorage vytváří „živé“ soubory, které pak Template může includovat. Pokud máš na serveru nějakou opcode cache, bude to velice rychlé.

Když ale storage změníš, tak se bude šablona vždy evalovat. A eval, jak všichni víme, je zlo a navíc ti to nikdy neukáže zkompilovaný kód šablony v laděnce, protože to není možné. S evalem jsou pak ještě další hnusné problémy. Věř mi, tohle nechceš :)

Editoval HosipLan (10. 7. 2012 14:00)

Pavel S.
Člen | 24
+
0
-

Pořád tomu moc nerozumím, možná proto, že nevidím úplně pod povrch frameworku. Jaký je rozdíl mezi tím, když načítám předkompilovanou šablonu z FileStorage cache a třeba z memcached storage?

Filip Procházka
Moderator | 4668
+
0
-

Mezi fileStorage a memcached storage neni vpodstatě rozdíl. Ale šablony používají Nette\Caching\Storages\PhpFileStorage. Tato storage vytváží „živé“ soubory, které pak šablony includují → je to rychlejší.