$form->onSuccess[] – Redirect hází prázdnou výjimku
- fikusir
- Člen | 27
Ahoj,
Mám toto zpracování formuláře:
public function formEditSucceeded(Form $form, \stdClass $values): void
{
$feedback=$this->feedbackManager->get((Int)$values->feedback_id);
$instruction=$this->instructionManager->get($feedback->instruction_id);
$request=$this->requestManager->get($instruction->request_id);
$matdata=$this->zpracovaniManager->getSingle($request->product);
$amount=$request->paleta*(Int)$values->pal + $matdata->ksKarton * (Int)$values->car;
try {
$this->feedbackManager->set((Int)$values->feedback_id, $amount, (Int)$values->scraps, (Int)$values->scrapscar);
$this->redirect('Feedbacktable:default');
} catch (Exception $e) {
$form->addError('Ve formuláři se vyskytla chyba: ' . $e->getMessage());
}
}
Když mám Redirect() v TryCatch, tak mi to stále hází prázdnou výjimku. Pokud ho z TryCatch vyjmu a nám na fonec metody, tak je to OK, nicméně to se mi zas nevypíše případná chyba.
Poradí někdo, prosím, jak je to správně? Moc díky
- Marek Bartoš
- Nette Blogger | 1274
V prvé řadě bys neměl odchytávat obecnou Exception. Co uživateli řekne, že máš chybu v kódu nebo že se nepodařilo připojit k databázi? Pokud potřebuješ uživateli předat zprávu skrze výjimku, tak si pro ni vytvoř třídu a odchytávej tu.
Redirect ti nefunguje právě proto, že vyhazuje výjimku, kterou hnedka
chytíš. Zda přesměrovat máš zjištíš
pomocí $form->hasErrors()
Editoval Marek Bartoš (3. 3. 2022 14:03)
- fikusir
- Člen | 27
Ahoj,
Moc díky pánové, všechny tři nápovědy dávají smysl a jsem zase o něco chytřejší. Rozhodně si vezmu k srdci to co jste napsat.
Marku, neměl jsem dobré znalosti ohledně obecné Exception a ty rozšířil Kcko. Jinak jsem uživatelům chtěl prostě cpát celou getMessage(). Jedná se o interní portál pro pár uživatelů a tak by mi bohatě stačilo, kdyby reportovali celou tu chybu.
Užijte sluníčka!
- Kamil Valenta
- Člen | 820
Není dobrý zvyk uživatelům předkládat „generické“ exceptiony.
Uživatele to nezajímá a nic jim to neřekne. V neposlední řadě ne vždy
domyslíš, co všechno uživateli vyzradíš (adresářovou strukturu, citlivá
data).
Tedy buď vykopnout vlastní Exceptionu se speciální textací pro uživatele
(jak již bylo uvedeno), nebo beze všeho poslat obecný alert, že to selhalo,
protože důvod najdeš v logu. Není důvod spoléhat na to, že to uživatel
bude někam reportovat.