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.