nový Configurator – továrničky (opět)

- Filip111
 - Člen | 244
 
Celý odpoledne se vrtám v nové verzi Nette a hraju si s neonem. Šla by nyní nahradit továrnička komponenty pouze zápisem v konfigu? Příklad:
	parameters:
		components:
			factories:
				bytyContactForm:
					class: \byty\ContactForm
					arguments: [@database]
Hlásí to chybu, že komponenta nebyla nalezena. Zkoušel jsem už spoustu variací na podobné téma, ale vždycky jsem na něčem ztroskotal.
Vycházím z posledních diskutovaných témat, kde se podobné věci dost diskutovali, ale netroufám se vmísit s mojí stupidní otázkou mezi elitu s tisící příspěvky ve fóru :)
https://forum.nette.org/…h-tovarnicek#…
https://forum.nette.org/…sledni-verzi
Editoval Filip111 (6. 1. 2012 15:51)

- Filip Procházka
 - Moderator | 4668
 
Vytváření komponenty můžeš mít v configu, pokud to zapíšeš správně.
factories:
	bytyContactForm:
		class: \byty\ContactForm
		arguments: [@database]
Ale stejně musíš zapsat továrničku do presenteru, nebo si přidat logiku, která je bude připojovat sama.

- Filip111
 - Člen | 244
 
Přepsal jsem v base presenteru metodu createComponent…funguje to ale je to docela bastl. Zkusím najít sám najít metodu vygenerovanou na základě definice factories v configu, pokud nic nenajdu volám standardní createComponent.
Bude to takhle fungovat nebo mi uniklo něco zásadního? Jestli Vás napadá jak to zlepšit nebo zkrášlit, budu rád.
factories:
	bytyContactForm:
		class: \byty\ContactForm
		arguments: [@database]
BasePresenter:
protected function createComponent($name) {
	$ret = false;
	$myName = 'create'.ucfirst($name);
	$callback = callback($this->getContext(), $myName);
	if (method_exists($this->getContext(), $myName)) {
		$ret = $callback->invoke();
	}
	if (!$ret)
		$ret = parent::createComponent($name);
	return $ret;
}
				
- Filip Procházka
 - Moderator | 4668
 
Tohle je kratší verze toho tvého.
protected function createComponent($name)
{
	if (method_exists($this->getContext(), $method = 'create'.ucfirst($name))) {
		$component = $this->getContext()->$method($name);
		if ($component instanceof Nette\ComponentModel\IComponent) {
			return $component;
		} // pokud objekt není komponenta, zahodit. Možná spíš vyhodit Nette\UnexpectedValueException
	}
        return parent::createComponent($name);
}
Ovšem má to zásadní problém ohledně bezpečnosti a vytváření libovolných komponent v libovolných presenterech.

- Filip Procházka
 - Moderator | 4668
 
To je divne, podivej se jak to mam resene ja, v tematu to popisuji, přijde mi to mnohem primocarejsi.