Řešení (ne)očekáváných chyb
- Fico
- Člen | 8
Dobré ráno všem,
dnes jsem psal pár podmínek v renderu a uvědomil jsem si, že je všude píšu jinak, nemám v tom žádný sysém i přesto, že bych chtěl. Proto jsem se chtěl zeptat zdejších, už zaběhlých jak třeba řeší následující –
public function renderDefault($id)
{
if ($id)
{
$userData = $this->context->users->find($id)->fetch();
if ($userData)
{
} else {
$this->flashMessage('Správce nebyl nalezen.');
$this->redirect('Homepage:');
}
} else {
throw new InvalidArgumentException('Chybí ID uživatele.');
}
}
Zda to řešíte takto, nebo třeba přes $this->error nebo FlashMessage a následný redirect. Díky
Editoval Fico (28. 3. 2013 9:05)
- David Matějka
- Moderator | 6445
invalid argument exception neni dobry napad. na produkci ti z toho nette udela err 500.
nejlepsi bude $presenter->error(), ten vyvola badrequestexception (defaultne s 404 errorem)
- srigi
- Nette Blogger | 558
Cely priklad sa da velmi zjednodusit
public function renderDefault($id)
{
$userData = $this->context->users->find($id)->fetch();
if (!$userData) {
$this->error('Správce nebyl nalezen');
}
// some code
}
ID nemusis kontrolovat, robi to za teba framework, preze ho explicitne
vyzadujes ako parameter akcie. $this->error()
vyhadzuje 404.
- Majkl578
- Moderator | 1364
srigi napsal:
ID nemusis kontrolovat, robi to za teba framework, preze ho explicitne vyzadujes ako parameter akcie.
$this->error()
vyhadzuje 404.
Dovolím si nesouhlasit (ač z praktického hlediska bych to udělal stejně, tak jak píšeš ty). Pokud ID nemá nenulovou hodnotu, nemá ani smysl pokládat dotaz do databáze a taková podmínka pak smysl má.
Fico napsal:
Zda to řešíte takto, nebo třeba přes $this->error nebo FlashMessage a následný redirect.
To velmi záleží na konkrétní situaci. Někdy je vhodné zobrazit 403/404, někdy přesměrovat např. na rozcestník nebo výpis kategorie a oznámit událost pomocí flash message.
- David Matějka
- Moderator | 6445
tak to zjednodusit takhle:
public function renderDefault($id)
{
if(!$id or !($userData = $this->context->users->find($id)->fetch())) {
$this->error();
}
}
:)
EDIT: @Majkl578: opravdu je idealni http presmerovani? ja to treba resim tak, ze vyvolam 404, ErrorPresenter zavola flashMessage a pomoci $this->forward() provede interni presmerovani na homepage
Editoval matej21 (28. 3. 2013 23:41)
- Majkl578
- Moderator | 1364
matej21 napsal(a):
EDIT: @Majkl578: opravdu je idealni http presmerovani? ja to treba resim tak, ze vyvolam 404, ErrorPresenter zavola flashMessage a pomoci $this->forward() provede interni presmerovani na homepage
Takže pak každá neexistující stránka bude duplicitní k homepage? Nebo bude zobrazovat homepage, ale házet 404? A co ti na to poví vyhledávače? :)
Lexi napsal(a):
Ja napr resim overovani zda zaznam existuje uz v actionXxx(), kde pripadne redirectuju. Je to podle me cistejsi nez redirectovat az v renderu a take rychlejsi.
Je to minimálně správnější. Ale rychlejší? Na základě čeho tak usuzuješ?
- David Matějka
- Moderator | 6445
Majkl578 napsal(a):
Takže pak každá neexistující stránka bude duplicitní k homepage? Nebo bude zobrazovat homepage, ale házet 404? A co ti na to poví vyhledávače? :)
zobrazuje homepage s flashmessage o nenalezene strance a vraci 404 http
kod. myslim, ze je to spravnejsi nez presmerovani s nejakym
30x
kodem.