„beforeRender“ v komponentách

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

Zdravím :)

Tápu v tom, jak správně ošetřit v komponentě vyjimku, která když nastane tak už nemá smysl pokračovat ve vykreslování komponenty.

Konkrétní příklad:

Snažím se psát komponenty tak, aby obsahovaly logiku pro načítání dat (z DB, Session..).

Komponenta pro potvrzení objednávky by mohla vypadat asi následovně..

class OrderSummary extends Control
{
    protected $orderSession;

    public __construct($orderSession)
    {
        $this->orderSession = $orderSession;
    }

    public function render()
    {
        $this->template->items = $this->orderSession->getItems(); // Tady dojde k chybě
    }
}

Problém nastává, pokud například session vyexpiruje a metoda getItems() vyhodí vyjimku – řekněme SessionException.

V tomto případě již nedává smysl pokračovat v potvrzení objednávky a tak bych rád vyjimku odchytil a přesměroval uživatele na jinou stránku.

Jelikož se ale vyjimka stala až v metodě render, tedy ve chvíli kdy už začalo vykreslování stránky, nelze již uživatele přesměrovat..

Z toho mi plyne, že metoda render není vhodná pro operace které mohou skončit vyjimkou (tedy právě načítání dat) a hodila by se metoda beforeRender kde bych mohl tyto operace provést. Ta ale v komponentě není..

Jak tedy takovou chybu správně ošetřit? Nebo musím data komponentě předávat z vnějšku?

ViPEr*CZ*
Člen | 818
+
+2
-

Si to obalte do try catch a misto items pokud to skočí do catch dejte prázdné pole. V šabloně pak podle toho, že pole je prázdné informujte nějak uživatele? To by mělo stačit… netřeba redirect.