Latte makra vyžadující službu – jak na to?
- David Matějka
- Moderator | 6445
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?
- David Matějka
- Moderator | 6445
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
@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)
- David Matějka
- Moderator | 6445
@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();