Logování všech formulářů jednoduše

Paradiso
Člen | 101
+
0
-

Ahoj,potřebujeme logovat formuláře a napadlo mě jednoduché řešení, kdy si udělám u formuláře rozšíření:

class LogForm extends{
...
        public function logThisForm(\Model\LogFormRepository $logFormRepository, $adminId, $formName = NULL) {
                $url = $_SERVER['REQUEST_URI'];// trošku hack, vím
                $this->onSuccess[0] = function(BootstrapForm $form) use ($logFormRepository, $adminId, $url, $formName){
                        $values = $form->values;
                        $logFormRepository->logForm($values, $url, $adminId, $formName);
                };
        }
}

myslel jsem si, že když do toho callbacku dám 0, tak se provede vždy jako první, ale takto mi nefunguje původní odeslání formuláře. Resepktive do logu se to uloží, ale pak už se neodešle formulář. Vím, že je to tou 0, ale jak na to? :/

Dá se nějak udělat pořadí callbacků? (zkoušel jsem googlit, ale moc jsem toho nenašel)

Nebo jaká je bestpractice u logování formulářů? Kdyby toto fungovalo, tak mi to přišlo strašně pohodlné a pro naše účely úplně dostačující.

Jan Endel
Člen | 1016
+
+2
-

Ahoj,

proč to potřebuješ nutně v tomto pořadí? Eventy jsou právě od toho, aby nezáleželo na jejich pořadí.

Případně si to obalit ještě nějakým kusem kódu, co se právě o ty priority bude starat.

ali
Člen | 342
+
0
-

No nikdy jsem to nepotreboval, ale nestacilo by to seradit nejak takto?

$form->onValidate[] = function ($form, $values) {
    ksort($form->onSuccess);
};
voda
Člen | 561
+
0
-

Pokud potřebuješ přidat logování před ostatní callbacky, tak použij array_unshift.

CZechBoY
Člen | 3608
+
0
-

Radši bych logoval až někde v modelové části konkrétní hodnoty než každé odeslání formuláře.
Můžeš se potom spolehnout, že až uděláš api (teď nemusí být v plánu, nebo nikdy) tak by se logovalo přímo z modelové vrstvy kterou použiješ, bez použití formuláře.

Paradiso
Člen | 101
+
0
-

Jan Endel napsal(a):

Ahoj,

proč to potřebuješ nutně v tomto pořadí? Eventy jsou právě od toho, aby nezáleželo na jejich pořadí.

Případně si to obalit ještě nějakým kusem kódu, co se právě o ty priority bude starat.

Toto je zajímavá poznámka, ale přeci po odeslání formuláře musím udělat redirect, abych zamezil opětovnému odeslání při F5. Nebo se mýlím a dělám to celou dobu špatně? Jinak by mi na pořadí callbacků vůbec nezáleželo, ale jakmile proběhne první callback s redirectem, tak se stopnou ostatní.

Paradiso
Člen | 101
+
0
-

CZechBoY napsal(a):

Radši bych logoval až někde v modelové části konkrétní hodnoty než každé odeslání formuláře.
Můžeš se potom spolehnout, že až uděláš api (teď nemusí být v plánu, nebo nikdy) tak by se logovalo přímo z modelové vrstvy kterou použiješ, bez použití formuláře.

Nad tímto jsem také přemýšlel, ale leč to není ideální, vyhovuje nám to v těch formech i s tím, že to budeme muset možná v budoucnu předělat.

Paradiso
Člen | 101
+
0
-

ostatním děkuji. vyzkouším a dám vědět

Paradiso
Člen | 101
+
0
-

voda napsal(a):

Pokud potřebuješ přidat logování před ostatní callbacky, tak použij array_unshift.

Tak vypadá, že toto řešení funguje přesně tak, jak jsem potřeboval, jediné co jsem musel udělat, tak ošetřit:

if($this->onSuccess === NULL){
        $this->onSuccess = [];
}

array_unshift($this->onSuccess, function(....

Děkuji moc za pomoc

Editoval Paradiso (15. 5. 2018 12:18)