Jak na development prostředí nastavit DummyStorage pro cache

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

Zdravím,
potřeboval bych nastavit cacheování. Cachování mi funguje, ale chtěl bych cachování vypnout pro development prostředí. Dočetl jsem se, že se na to hodí DummyStorage. Jenomže nevím jak přesně nastavit, aby se použilo DummyStorage jenom na development prostředí. Někde jsem se dočetl, že se dá dát do config.ini tohle:

[development.service!]
Nette-Caching-ICacheStorage = "Nette\Caching\DummyStorage"

Jenomže to my skončí s chybou, že ICacheStorage už je zaregistrováno a nejde znovu zaregistrovat. Proto jsem do bootstrapu přidal toto:

Environment::getServiceLocator()->removeService('Nette\Caching\ICacheStorage');

Dále jsem do config.ini přidal tohle:

[production.service!]
Nette-Caching-ICacheStorage = "Nette\Caching\FileStorage"

Jenomže tohle nefunguje, protože ten FileStorage nemá nastavený žádný adresář do kterého by měl ukládat soubory. A na production modu aplikace končí s chybou:

RuntimeException

Directory name must not be empty.

Takže se ptám. Jde nějak nastavit cachování tak, aby fungovalo pouze na production modu a nikoliv na development modu?

Filip Procházka
Moderator | 4668
+
0
-

co zkusit jiný zápis?

[development < common]
service.Nette-Caching-ICacheStorage = DummyStorage

Editoval HosipLan (15. 10. 2009 16:30)

JajazXbm
Člen | 29
+
0
-

No tak sem to vyzkoušel a dostal jsem známou chybu:

Nette\AmbiguousServiceException

Service named ‚Nette\Caching\ICacheStorage‘ has been already registered.

kravčo
Člen | 721
+
0
-

Skús

bootstrap.php

if (!Environment::isProduction()) {
    $locator = Environment::getServiceLocator();
    $locator->removeService('Nette\Caching\ICacheStorage');
    $locator->addService('Nette\Caching\ICacheStorage', 'Nette\Caching\DummyStorage');
}

Inak toto podľa mňa nie je úplne v poriadku – prepísanie predvolených nastavení services je predsa prirodzené v duchu convention over configuration. Vyššie popísané nahradzovanie je trochu dosť WTF…

JajazXbm
Člen | 29
+
0
-

kravčo: přesně tak to mám udělané. Také mě to přijde dost WTF. Ale rád bych věděl jak jinak to udělat.

kravčo
Člen | 721
+
0
-

JajazXbm napsal(a):

kravčo: přesně tak to mám udělané. Také mě to přijde dost WTF. Ale rád bych věděl jak jinak to udělat.

Chcel som tým povedať, že na to, aby to šlo lepšie, treba upraviť Nette…

stpnkcrk
Generous Backer | 190
+
0
-

Vzpomínal jsem, že jsem kdysi používal DummyStorage, zkusil jsem jeho nastavení i s nejnovější revizí (4572408) a ono to funguje. Zkoušel jsem Nette pro PHP 5.2 i PHP 5.3.

Nicméně, protože Template používá vlastní nastavení CacheStorage, je potřeba nastavení provést na dvou místech (v config.ini pro RobotLoader a ostatní volání Environment::getCache() a ideálně v bootstrap.php pro třídu Nette\Templates\Template). ;)

config.ini

[development < common]  ; Nette pro PHP 5.3
service.Nette-Caching-ICacheStorage = Nette\Caching\DummyStorage

[development < common]  ; Nette pro PHP 5.2
service.Nette-Caching-ICacheStorage = DummyStorage

bootstrap.php (zkoušel jsem to na různých místech bootstrap.php, na funkčnost to nemělo vliv)

if (!Nette\Environment::isProduction()) {  // Nette pro PHP 5.3
    Nette\Templates\Template::setCacheStorage(new Nette\Caching\DummyStorage);
}

if (!Environment::isProduction()) {  // Nette pro PHP 5.2
    Template::setCacheStorage(new DummyStorage);
}
David Grudl
Nette Core | 8166
+
0
-

kravčo napsal(a):

Chcel som tým povedať, že na to, aby to šlo lepšie, treba upraviť Nette…

Fixed

David Grudl
Nette Core | 8166
+
0
-

V config.ini by mělo tohle fungovat jak v PHP 5.3, tak 5.2

[development < common]
service.Nette-Caching-ICacheStorage = Nette\Caching\DummyStorage