K čemu je vlastně LatteFactory?
- Svaťa Šimara
- Člen | 98
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 | 8218
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 | 661
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
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
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 | 661
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)
- Svaťa Šimara
- Člen | 98
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
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
@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?