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

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

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)

Aurielle
Člen | 1281
+
0
-

Pokud vím, tak se o návrhu na implementaci tohoto chování zatím jen diskutovalo… což znamená že tvůj kód nebude bez patřičných úprav třeba BasePresenteru fungovat.

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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.

22
Člen | 1478
+
0
-

…asi by to chtělo v komponentách něco jako setPermissions(), aby se dal ovlivňovat přístup k nim už při jejich vytváření?

Filip Procházka
Moderator | 4668
+
0
-

To je divne, podivej se jak to mam resene ja, v tematu to popisuji, přijde mi to mnohem primocarejsi.

22
Člen | 1478
+
0
-

říkal jsem i něco, jestli myslíš toto :-)