Extension macro, ako predat macru service cache?
- duskohu
- Člen | 778
Caute, neviete mi niekto poradit? Robim si Extension macro ale potreboval by
som macru predat cache, len neviem ako to zrealizovat.
registrace
public function loadConfiguration() {
$builder = $this->getContainerBuilder();
$config = $this->getConfig($this->defaults);
$builder->addDefinition($this->prefix('cacheStorage'))
->setClass('Nas\ThumbMacro\CacheStorage', array($config['cacheDirectory'], $config['cacheUrl']));
if ($builder->hasDefinition('nette.latte')) {
$builder->getDefinition('nette.latte')
->addSetup('Nas\ThumbMacro\ThumbMacro::install(?->getCompiler())', array('@self'));
}
}
macro:
private $cache;
public static function install(\Nette\Latte\Compiler $compiler, $cache) {
$this->cache = $cache;
$me = new static($compiler);
$me->addMacro('thumb', 'echo ' . __CLASS__ . '::renderThumbnail(%node.array);');
}
- enumag
- Člen | 2118
Na to zapomeň. :-) Makro žádnou cache nepotřebuje, pouze se přeloží na kód, který zavolá nějakou tvou službu, např. Thumbnailer, která si cache už obstará přes DI. Ukládání miniatur ani náhodou nemá být závislé na nějakém makru potažmo Latte, to makro je pouze zkratka, logika patří jinam.
EDIT: Realizaci makra si představuji přibližně takto, z toho asi lépe pochopíš co mám na mysli. ;-)
$me->addMacro('thumb', 'echo $_presenter->getContext()->getByType("Thumbnailer")->getThumbnailUrl(%node.array);');
Editoval enumag (7. 3. 2013 10:49)
- enumag
- Člen | 2118
@pekelnik: Nad tím jsem přemýšlel, ale nelíbí
se mi to. Chci Extension nainstalovat jedním řádkem v neonu a používat
makrem v šabloně – nic víc někde v BasePresenteru nebo kdekoli jinde.
Samozřejmě ten service locator není ideální, lepším řešením je
vytváření šablon pomocí služby nette.templateFactory
a
předání $thumbnailer šabloně skrz setup té factory. Problém tohoto (a
i tvého) řešení je, že se služba vytvoří i tehdy pokud není potřeba,
když používám service locator, je to lazy.
- Majkl578
- Moderator | 1364
enumag napsal(a):
Problém tohoto (a i tvého) řešení je, že se služba vytvoří i tehdy pokud není potřeba, když používám service locator, je to lazy.
To je spíš takový pseudoproblém. Máš snad v konstruktoru něco, co by významně ovlivnilo délku běhu aplikace?
class Foo {}
$tmp = array_fill(0, 1e4, NULL);
$m = memory_get_usage();
$t = microtime(TRUE);
for ($i = 0; $i < 1e4; ++$i) {
$tmp[$i] = new Foo();
}
var_dump(microtime(TRUE) - $t);
var_dump(memory_get_usage() - $m);
double(0.015384912490845)
int(3383912)
10000 instancí této jednoduché třídy Foo sežere 0.015 sekundy a 3.3MB
paměti na PHP 5.4.12.
Takže zas bych to s lazy přístupem nepřeháněl.