Návrat hodnoty z události ve Formuláři / Presenteru

MartinVolenec
Člen | 36
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
+2
-

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
+
0
-

@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
+
+1
-

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