K čemu je vlastně LatteFactory?

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

Zdarec,

pochopil jsem správně, že Latte\Engine je služba, kterou je možné kompilovat více .latte souborů?

Pokud jo, k čemu je vlastně ILatteFactory ? Vždyť je to vlastně služba na službu. Když se podívám, jak se vytváří šablony, tak přes TemplateFactory. v metodě createTemplate vytvářím pro každou šablonu nový engine.

Vytvářet službu pro každou instanci šablony mi prostě přijde zvláštní. Muselo mi něco uniknout, proto tato otázka.

Ano, všiml jsem si, že Engine má událost onCompile, ale není toto pole pro každou šablonu v systému stejné?

Dík za odpověď

David Grudl
Nette Core | 8154
+
+1
-

Latte\Engine je objekt na kompilaci/vykreslení šablon. Není to služba. Každý si totiž nakonfiguruje Latte\Engine jinak. Službou je továrna, která Latte\Engine vytváří (aby si je každý mohl nakonfigurovat), a tou je právě LatteFactory.

Martk
Člen | 656
+
+1
-

Zkus si něco přečíst o návrhovém vzoru factory method.

Ještě doplním tvé otázky:

pochopil jsem správně, že Latte\Engine je služba, kterou je možné kompilovat více .latte souborů? Ano

Pokud jo, k čemu je vlastně ILatteFactory ? K vytváření nových (unikátních) instancí, aby se navzájem neovlivňovaly a aby jsi svůj kód nespojoval s konkrétní implementaci.

Vytvářet službu pro každou instanci šablony mi prostě přijde zvláštní. Muselo mi něco uniknout, proto tato otázka.

Představ si, že máš v presenteru:

$this->template->foo = "myString";

a přidáš k tomu nějakou cizí třídu, aniž bys četl zdroják a předáš mu tu samou instanci:

new Ctrl($this->template);

// Takhle vypadá třída
class Ctrl {

	public function __construct($template) {
		$template->foo = ['my', 'array']; // Najednou nemáš v presenteru "myString", ale tohle pole.
	}
}

Tohle je ještě jednoduchý příklad, můžou se dít i jiné a horší čertoviny.

Editoval Antik (20. 5. 2016 16:00)

srigi
Nette Blogger | 558
+
0
-

Tiez som nedavno narazil na drobny problem sposobeny tym, ze pre kazdy komponent sa vyraba vlastny Latte engine. Makra/helpery zaregistovane cez BasePresenter nie su dostupne v UI\Control sablonach.

Tu prave pride vhod LatteFactory, ktoru si je nutne nakonfigurovat cez DI extension a makra/helpery zaregistrovat v LatteFactory:

use Latte\Compiler;
use Nette\Bridges\ApplicationLatte\ILatteFactory;
use Nette\DI;

class MacrosExtension extends DI\CompilerExtension
{
	public function beforeCompile()
	{
		$builder = $this->getContainerBuilder();
		$latteFactory = $builder->getDefinition($builder->getByType(ILatteFactory::class));
		$latteFactory->addSetup('App\Extensions\MacrosExtension::install(?->getCompiler())', ['@self']);
	}

	public static function install(Compiler $compiler)
	{
		$ifCurrentInMacro = new Macros\IfCurrentInMacro($compiler);
		$ifCurrentInMacro->register();
	}
}
Svaťa Šimara
Člen | 98
+
0
-

Děkuji Vám za odpovědi.

Zkusím se zeptat ještě jinak – pokud bude v mojem případě Engine konfigurován vždy stejně, dává smysl použít pro renderování více šablon ten samý objekt Engine? Nebo si tím naběhnu na jakýkoliv problém?

@Antik Tvůj příklad s předáváním šablony je legitimní, ale týká se předávání ApplicationLatte\Template, a ne Latte\Engine.

Martk
Člen | 656
+
0
-

Template má v sobě zapouzdřeno Latte\Engine a jenom rozšiřuje možnosti Latte\Engine. Místo parametrů si můžeš představit filtry.

Filtry a makra registruji jako @srigi , když chci mít vlastní proměnné všude v šablonách, tak přepíšu původní template factory a registruji jako službu svojí novou třídu.

Editoval Antik (23. 5. 2016 11:51)

newPOPE
Člen | 648
+
0
-

@srigi lenze na to nemusis pisat vlastnu factory ani DI extension. Makra aj helpery isli registrovat v config-u len mi bolo povedane, ze si ma kazdy (komponent) registrovat veci sam. To co sa tu riesi je v podstate ten isty sposob ako cez config…

CZechBoY
Člen | 3608
+
0
-

@newPOPE myslim, že @srigi ukazuje di extension, které  latte.

newPOPE
Člen | 648
+
0
-

@CZechBoY no neviem ma tam App\Extensions\MacrosExtension::install... cize to vyzera na custom. Ale tak ci tak DI extension ktoru ma Nette default zaregistruje makra za teba.

Svaťa Šimara
Člen | 98
+
0
-

Dík za odpovědi.
Už vidím důvod existence Factory – pokud chci různé filtry a různá makra pro různé části webu.

Pokud ale chci stejné filtry a stejná makra pro všechny části webu, tak je LatteFactory vlastně překážka, kterou všichni řešíte pomocí extenze nebo definicí vlastní Factory.

David Matějka
Moderator | 6445
+
0
-

factory neni prekazka. makra i filtry se nechaji registrovat v configu.

Pokud ale chci stejné filtry a stejná makra pro všechny části webu

a kde bys je chtel registrovat?

v configu? tak to se nic nemeni.

v presenteru? pak by ti to treba nemuselo fungovat v mailech.

a taky, proste nechces, aby treba nejaka komponenta treti strany ti ovlivnila engine instalaci nekterych svych filtru.

Svaťa Šimara
Člen | 98
+
0
-

@DavidMatějka Děkuji za odpověď

a taky, proste nechces, aby treba nejaka komponenta treti strany ti ovlivnila engine instalaci nekterych svych filtru.

Toto beru jako relevantní argument pro Factory

Filtry a makra se musí zaregistrovat jak pro Factory, tak pro Engine. A je úplně jedno, kde se budou registrovat, o to v této otázce nejde.

Celý vtip je v tom, že pokud chci jedno nastavení filtrů a maker, vystačím si s jednou instancí Engine, nepotřebuji Engine pro každou šablonu. Takže pokud chci jedno nastavení filtrů a maker, nepotřebuju LatteFactory. A to byla ta moje původní otázka – k čemu to vlastně je?