Řešení (ne)očekáváných chyb

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Fico
Člen | 8
+
0
-

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

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

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

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

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)

Jan Mikeš
Člen | 771
+
0
-

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.

Majkl578
Moderator | 1364
+
0
-

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

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.

llook
Člen | 407
+
0
-

Jenže ta stránka není nenalezená, ale uživatel pro ni není autorizovaný. Na to je kód 403. A spíš než na hlavní stránku bych forwardoval na jednoduchou přihlašovací stránku.