Vytváření komponent přes interface factories a připojování k parentovi

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

Zdravím,
tohle je možná trochu hloupá otázka, ale nemůžu se dobrat odpovědi. Pokud používám interfacové továrničky na komponenty (viz https://doc.nette.org/…tion/factory ) a vytvářím komponenty takhle:

protected function createComponentRegistration()
{
    return $this->registrationControlFactory->create();
}

přičemž komponenta vypadá nějak takhle

class RegistrationControl extends Nette\Application\UI\Control
{

    public function __construct(Something $someDependencies, IComponent $parent, $name)
    {
        parent::__construct($parent, name);
		// ...
    }
}

předpokládám, že továrna má vypadat nějak takhle:

interface IRegistrationControlFactory {

	/** @return RegistrationControl */
	function create(Something $someDependencies, IComponent $parent, $name);
}

Jak to ale provést s $parent a $name? Čeho chci dosáhnout je, že $parent a $name si předávám z komponenty/presenteru, kde danou komponentu vytvářím, tak, že je předám jako argumenty metodě create. Ale když napíšu továrnu takhle:

interface IRegistrationControlFactory {

	/** @return RegistrationControl */
	function create(IComponent $parent, $name);
}

končím na rozdílnosti signatury konstruktoru komponenty a metody create. Když tam uvedu i parametr Something $someDependencies, tak to zase budu muset předávat v presenteru, čímž celá ta super věc s interface factory ztrácí smysl.

Je nějaký způsob, jak z toho ven? Uniká mi něco základního? Nebo se snažím o nemožné?

CZechBoY
Člen | 3608
+
0
-

A na co to potřebuješ? Komponenty se samy připojí při volání metody attached.

chikeet
Člen | 160
+
0
-

CZechBoY napsal(a):

A na co to potřebuješ? Komponenty se samy připojí při volání metody attached.

Takže se to provede nějak magicky? Jde mi čistě o to, aby to bylo připojeno – abych mohla třeba z formu volat $presenter->link() apod. (eliminovat takové ty různé problémy vznikající z toho, když komponenta nemá parenta) nebo v případě potřeby z parenta přistupovat ke komponentě přes ArrayAccess. A co $name, nastaví se taky automaticky podle názvu metody createComponent*?

janpecha
Backer | 75
+
+3
-

Žádná magie v tom není – pokud továrnička (createComponent*) vrátí komponentu, dojde k jejímu připojení do stromu komponent – to se projevuje tak, že je jí přiřazen parent a name a můžeš k ní přistupovat přes ArrayAccess. $parent a $name tak můžeš z interface vyhodit a nemusíš je uvádět ani v __constructoru komponenty (ty parametry jsou nepovinné).

Editoval janpecha (30. 11. 2016 20:37)

mkoubik
Člen | 728
+
+4
-

… a pokud máš v konstruktoru nějaký kód, který spoléhá na to že je komponenta připojena, tak ho přesuň do metody attached().

iNviNho
Člen | 352
+
+2
-

@chikeet celá nejaká logika po submitnutí formulára by mala ostať v komponente, alebo ešte v lepšom prípade možno delegovať funkcie iným službám. Presenter väčšinou slúži na bud nejaký redirect, alebo poslanie flashMessage na stránku.

Preto na takéto situácie by som využíl možnosť callbacku, skús sa inšpirovať tu https://doc.nette.org/…s/form-reuse#…

alebo http://www.slideshare.net/…te-framework

Editoval iNviNho (30. 11. 2016 17:58)