Návrat hodnoty z události ve Formuláři / Presenteru
- MartinVolenec
- Člen | 36
Chtěl bych se zeptat, zda je možné vrátit z události nějakou hodnotu / proměnou.
Mějme následující příklad:
Control:
public function formSucceeded(UI\Form $form, ArrayHash $values)
{
/* Něco se děje před */
$this->onAuthenticate($form, $values);
/* Něco se děje poté */
}
Presenter:
public function createComponentLoginForm()
{
$control = $this->loginFormFactory->create();
$control->onAuthenticate[] = function (UI\Form $form, ArrayHash $values) {
$response = /* Zde se získá odpověď od remote serveru */
/* A nyní se tok programu vrací do Controlu->formSucceeded*/
/* Lze tuto odpověď od serveru předat zpět do toho Controlu a pracovat tam s ní?*/
};
return $control;
}
Zkoušel jsem si hrát s callbacky a předávání referencí &, ale marně.
Děkuji za všechny rady.
- Ondřej Kubíček
- Člen | 494
není jednoduší si do toho controlu injectnout servisu, která vrátí tu response co potřebuješ a pokračuješ dál? když to potřebuješ mít přímo v succeed
- Polki
- Člen | 553
Tak buď si v controlu nastavíš nějakou property, , kterou pak budeš plnit asi takto:
public function createComponentLoginForm()
{
$control = $this->loginFormFactory->create();
$control->onAuthenticate[] = function (UI\Form $form, ArrayHash $values) {
$control->myProperty = $response = ???;
};
return $control;
}
- neodzkoušeno.
Nebooo jak píše Ondřej, tak si přímo do controlu předáš service, který pracuje s čím potřebuješ a odchytíš chování přímo tam, což mi přijde jako lepší řešení, pokud nemáš nějaký závažný důvod to dělat tak, jak to máš.
- MartinVolenec
- Člen | 36
@OndřejKubíček Takový přístup bych za normálních okolností použil.
Jenže se jedná o aplikaci, který je 100% závislá na API. Bere z něj
všechna data.
A již jsem si vytvořil systém na tvorbu requestu, který je součástí
Presenterů. Takže bych chtěl ty requesty volat pouze v presenterech. To je
ten důvod, proč se na tohle ptám.
@Polki Heh…vidíš to mě nenapadlo. Zkusím.
- MajklNajt
- Člen | 498
ja by som možno takto nejako postupoval, princíp je v zásade podobný ako píše @Polki, ale toto mi príde čistejšie :)
Control:
public function formSucceeded(UI\Form $form, ArrayHash $values)
{
/* Něco se děje před */
$responseDTO = new ResponseDTO; // napíšeš si jednoduchú prepravku
$this->onAuthenticate($form, $values, $responseDTO);
$responseFromAPI = $responseDTO->getResponse();
/* Něco se děje poté */
}
Presenter:
public function createComponentLoginForm()
{
$control = $this->loginFormFactory->create();
$control->onAuthenticate[] = function (UI\Form $form, ArrayHash $values, ResponseDTO $responseDTO) {
$response = /* Zde se získá odpověď od remote serveru */
$responseDTO->setResponse($response);
};
return $control;
}
Medzi presenterom a controlkou sa bude odovzdávať iba referencia na objekt, čiže nemusíš riešiť žiadny return atď…
- MartinVolenec
- Člen | 36
@MajklNajt Stará dobrá přepravka. To mě vůbec nenapadlo. Zároveň se mi líbí, že tuto Response přepravku využiji na více místech.
Snad dnes večer ozkouším a dám vědět.
Zatím děkuji.
Edit:
@MajklNajt Funguje skvěle. Nevím, jestli je to ta nejlepší cesta na světě, ale mě pomohla a hodně se mi líbí. Ještě jednou děkuji.
Editoval MartinVolenec (5. 12. 2018 21:25)
- Polki
- Člen | 553
MajklNajt napsal(a):
ja by som možno takto nejako postupoval, princíp je v zásade podobný ako píše @Polki, ale toto mi príde čistejšie :)
Control:
public function formSucceeded(UI\Form $form, ArrayHash $values) { /* Něco se děje před */ $responseDTO = new ResponseDTO; // napíšeš si jednoduchú prepravku $this->onAuthenticate($form, $values, $responseDTO); $responseFromAPI = $responseDTO->getResponse(); /* Něco se děje poté */ }
Presenter:
public function createComponentLoginForm() { $control = $this->loginFormFactory->create(); $control->onAuthenticate[] = function (UI\Form $form, ArrayHash $values, ResponseDTO $responseDTO) { $response = /* Zde se získá odpověď od remote serveru */ $responseDTO->setResponse($response); }; return $control; }
Medzi presenterom a controlkou sa bude odovzdávať iba referencia na objekt, čiže nemusíš riešiť žiadny return atď…
Pravda pravda