Latte makra vyžadující službu – jak na to?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Matějka
Moderator | 6445
+
0
-

Jak řešíte, když máte makro, které pro svůj běh vyžaduje nějakou service?

napadají mě dvě možnosti
1 – pracné – pokud budu chtít makro používat, budu muset to template poslat službu
2 – nehezké – makro si vytáhne službu z kontextu (a ten z presenteru). navíc se nenechá použít, když chybí presenter

kdyby existovalo TemplateFactory, byla by zde taky možnost nastavování této služby globálně – což taky není hezký a navíc ne-lazy

nějaký tipy?

vvoody
Člen | 910
+
0
-

Makro je vlastne funkcia function($node, $writer). Obal ju do triedy a tú zaregistruj ako službu. V službe si vyžiadať inú službu už určite zvládneš.

David Matějka
Moderator | 6445
+
0
-

sorry, nenapsal jsem to dost jasne – nemyslim, kdyz macro writer potrebuje sluzbu, ale kdyz kod, ktery generuje, potrebuje sluzbu

Editoval matej21 (6. 1. 2014 19:56)

enumag
Člen | 2118
+
0
-

@vvoody: Chápeš to špatně, mluvíš o compile time závislostech, kdežto @matej21 řeší runtime závislost – tedy službu kterou vyžaduje kód vygenerovaný tím makrem. Makro samotné (instance MacroSet) už se tehdy vůbec nedostane ke slovu.

@matej21: Už se to tu řešilo dříve, že odpovědí je TemplateFactory se ví, prozatím se to řeší buď přes context (můj případ) nebo tak že se vyžaduje aby programátor tu službu ručně v presenteru předal šabloně. TemplateFactory způsob lazy být může, stačí nepředávat přímo službu, ale accessor (= callback který ji vrátí – služba se vytvoří při prvním voláním callbacku, nebyla-li již vytvořena dříve).

Editoval enumag (6. 1. 2014 20:01)

vvoody
Člen | 910
+
0
-

Tak potom asi prvá možnosť, aj niektoré defaultné makrá na to spoliehajú že tam majú nejakú službu/objekt.

akadlec
Člen | 1326
+
0
-

Asi to nikdo nedořešil co? Mám extension která si zaregistruje vlastní makra ale ty potřebují služby té extension. Moc se mi právě nelíbí že se to musí předat ručně v createTemplate.

David Matějka
Moderator | 6445
+
0
-

@akadlec: slo by to resit vlastni template factory, konkretne treba tou od enumaga – ty konfiguratory jsou na to idealni

Ja, jelikoz jsem linej ty sluzby posilat rucne, si do template poslu container, ze ktereho si to vytahnu. + tam mam i fallback, kdyby tam ten container nebyl, vysledek pak vypada treba takhle:

if(!isset($context)) {
	$context = $presenter->getContext();
}
if(!isset($_myFooService)) {
	$_myFooService = $context->getByType('....');
}
$_myFooService->doBar();