Vytváření komponent přes interface factories a připojování k parentovi
- chikeet
- Člen | 160
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é?
- chikeet
- Člen | 160
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
Žá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 __construct
oru komponenty (ty parametry jsou nepovinné).
Editoval janpecha (30. 11. 2016 20:37)
- iNviNho
- Člen | 352
@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)