„Životní cyklus“ Controly
- _Martin_
- Generous Backer | 679
Zajímalo by mě, jak přesně jsou volány metody Controly – konkrétně
loadState
, saveState
a signalReceived
.
Zvláště u prvních dvou jsem narazil na jednu zvláštnost, ale nejsem si
jist, zda jde o bug.
Metoda loadState
– zdá se – je volána vždy a jako
první. Ovšem metoda saveState
je volána jenom někdy – a to
mi přijde podivné. Pokud vytvořím komponentu v továrničce:
public function createComponentBar()
{
$foo = new Bar; // je jedno, zda ji připojím hned
return $foo;
}
a následně ji vykreslím v šabloně
{control bar}
metoda saveState
zavolána NEBUDE.
Pokud k této komponentě přistoupím v presenteru:
public function actionDefault()
{
$this['bar']; // toto stačí
}
bude metoda saveState
zavolána celkem TŘIKRÁT.
Ovšem – pokud k ní přistoupím v presenteru, ale AŽ v metodě
render
:
public function renderDefault()
{
$this['bar']; // toto stačí
}
bude metoda saveState
zavolána JEDNOU.
Nyní zapojíme metodu signalReceived
. Pokud je na komponentě
volán signál, metoda saveState
se provede vždy
(i v případě, že ke komponentě nepřistupujeme v žádné z metod
action
, render
a ani v šabloně). Metoda
signalReceived
je volána před posledním voláním metody
saveState
. V případě použití metody action
(viz.
výše) je pořadí volání následující:
- loadState
- saveState
- saveState
- signalReceived
- saveState
Ve zbylých případech je vždy:
- loadState
- signalReceived
- saveState
Jsem zmaten, pomůže mi to někdo objasnit? Prosím.
- Honza Marek
- Člen | 1664
Já ti to bohužel neobjasním, ale taky by mě to zajímalo. Až mě to bude zajímat ještě víc, tak bych třeba proved průzkum zdrojáků. Otázka je, jak moc je to zakuklené.
- Panda
- Člen | 569
Naprosto přesně to nevím, nicméně je to nějak takto:
loadState()
je volán vždy při připojení komponenty
k presenteru.
Pomocí metody signalReceived()
se předává signál, tudíž
je volána jen v případě, že voláme signál komponenty.
saveState()
se volá v následujících případech:
- Vytváření odkazu (nezkoumal jsem to přesně, ale zdá se, že v případě vytváření odkazu na signál persistentní komponenty může dojít až k dvojímu volání, ale s tím si nejsem jistý).
- Ukládání „globálního stavu“ (
saveGlobalState()
) po voláníafterRender()
(ta se volá porender<action>()
), ale před vykreslením šablony. Z toho tedy vyplývá, že pokud se komponenta vytvoří až v šabloně ({control bar}
), k volánísaveState()
nedojde, protože v době volánísaveGlobalState()
ještě neexistuje. Pokud volám signál, komponenta se automaticky vytvoří a k volání dojde.
Doufám, že tomu je alespoň trochu rozumět a že nejsem úplně mimo…