Extension macro, ako predat macru service cache?

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

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

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)

pekelnik
Člen | 462
+
0
-

Jeste lepe pravdepodobne takto:

$set->addMaro('thumb', 'echo $thumbnailer->getThumbnailUrl(%node.array);');

pritomnost $thumbnaileru v sablone je potom plne v rezii programatora a zamezi se osklivemu zneuzivani DI containeru jako service locatoru.

duskohu
Člen | 778
+
0
-

Dakuejm

enumag
Člen | 2118
+
0
-

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

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.

enumag
Člen | 2118
+
0
-

@Majkl578: V tom případě ok. Stejně však dokud nebude ta templateFactory, budu používat service locator. Díky. ;-)