Přesměrování v presenteru vyhazuje výjimku
- BigCharlie
- Člen | 283
Dokázal by mi někdo vysvětlit, proč je následující konstrukce v presenteru nevhodná?
public function save(array $data)
{
try {
$this->redirect('edit');
}
catch (Exception $e)
{
$this->flashMessage($e->getMessage(), 'error');
}
}
Problém vzniká na tomto řádku, tj. každé přesměrování, včetně bezproblémových vyvolává výjimku AbortException. Pokud odstraním zachytávání výjimky, vše funguje bez problémů.
- Honza Marek
- Člen | 1664
Protože prostě přesměrování generuje výjimku. Asi aby pak nepokračovalo zpracování scriptu dále. Dá se to řešit tak, že budeš odchytávat konkrétnější výjimku anebo výjimku znovu vyhodíš, pokud bude typu AbortException.
- kravčo
- Člen | 721
BigCharlie napsal(a):
Dokázal by mi někdo vysvětlit, proč je následující konstrukce v presenteru nevhodná?
Pretože na presmerovanie sa používajú výnimky AbortException (kedysi RedirectingException). Riešením je výnimku obmedziť (na InvalidStateException)
try {
$this->redirect('this');
} catch (InvalidStateException $e) {
// ...
}
alebo (na všetky okrem AbortException)
try {
$this->redirect('this');
} catch (AbortException $e) {
throw $e;
} catch (Exception $e) {
// ...
}
- BigCharlie
- Člen | 283
Díky za objasnění, myslel jsem si, že to důvod jistě má. Problémem je, že na to člověk narazí spíš omylem. A skuečně překvapí, že se výjimka vyhazuje vždy.
Konkrétně jsem v bloku try měl další kód, který ukládal cosi do DB a na základě výsledku buď zobrazil chybovou hlášku, nebo přesměroval. Tedy původně:
try {
$record_id = $model->save($form->getValues());
$this->redirect('edit', $record_id);
}
catch (InvalidStateException $e)
{
$this->flashMessage('Chyba při ukládání do databáze: ' . $e->getMessage(), 'error');
}
Vadou je, že i když se uloží vše do DB jak má, dostanu na výstupu prázdný div od flash messages a redirect se neprovede.
Nahradil jsem to tímhle:
try {
$record_id = $model->save($form->getValues());
}
catch (InvalidStateException $e)
{
$this->flashMessage('Chyba při ukládání do databáze: ' . $e->getMessage(), 'error');
}
if (isset($record_id)) {
$this->redirect('edit', $record_id);
}
To funguje k mé spokojenosti.