Egoblog.cz - Petr Kobelka

Nette Grido a zachytávání vyjímek

Chci v případě, že mi Grido vrací vyjímku, např. kvůli chybnému databázovému dotazu, tuto vyjímku zachytit a grid nezobrazit. Ale nechci, aby mi to zablokovalo celou stránku.


PHP | Komentáře (0) | Shlédnuto 1101 × | Vloženo: 1. března 2015

Co chci s Grido a Nette udělat

Chci, v případě, že mi Grido vrací vyjímku, např. kvůli chybnému databázovému dotazu, tuto vyjímku zachytit a grid nezobrazit. Ale nechci, aby mi to zablokovalo celou stránku. Zde vám ukážů moje řešení.

Základní požadavky na Grido a Nette

Celý grid vytvářím přes továrničku createComponent. Grid chci zobrazit na stránce. Pokud nastane v gridu chyba, chci ji zachytit a zbytek stránky zobrazit jak se patří.

Z počátku se to zdálo jako neřešitelný problém. Když jsem zdolal jednu chybu, objevila se jiná. Postupně jsem se pak dokousal k řešení, které je celkem jednoduché a funkční.

Důležité je si uvědomit, že musíte továrničkou vrátit objekt komponenty! NULL a jiné hodnoty Vám to nevezme.

Můj základní kód vypadal takto (PHP kód je zjednodušen pro ukázku na webu):

/**
 * grid
 *
 * @param string $name
 * @access protected
 */
protected function createComponentGrid($name)
{
  $grid = new \UzivatelGrid();
  $gout = $grid->getDefault();
  $gout->getCount(); //tohle je tu z duvodu, aby se poslal nejaky dotaz do db a mohli jsme zde zachytit pripadnou chybu
  parent::addComponent($gout, $name);

  return $gout;
}

Tedy si separuji tvorbu gridu do vlastní třídy - to mi v budoucnu zjednoduší úpravy. Když v tuto chvíli nastala chyba databáze (neplatný dotaz, nedostatečná oprávnění, ...) web "havaroval" s chybou 500, nebo zobrazením vyjímky - záleží na nastavení conf.neon.

Zkusíme Grido podpořit pomocí try-catch

Ano, zkusil zahytit vyjímku pomocí try-catch. Zde ale nastal problém, protože Nette nedostalo továrničkou komponentu a tedy zařvalo Nette. Chybu jsem odchytil - objevila se jiná.
Nette na mě řvalo, že vrácená hodnota není objektem komponenty.

protected function createComponentGrid($name)
{
  try
  {
    $grid = new \UzivatelGrid();
    $gout = $grid->getDefault();
    $gout->getCount(); //tohle je tu z duvodu, aby se poslal nejaky dotaz do db a mohli jsme zde zachytit pripadnou chybu
    parent::addComponent($gout, $name);

    return $gout;
  }
  catch (\Exception $e)
  {
    echo 'Chyba: '.$e->getMessage();
  }
}

Co s Nette a Grido dále provedeme?

Vzhledem k tomu, že jsem zároveň psal nějaké UnitTesty, napadlo mě mockovat objekt komponenty. Vytvořil jsem si práznou komponentu, které mohu jako parametr do konstruktoru předhodit, libovolný text, který mi pak zobrazí na místo datagridu.

Kód komponenty je zde:

class EmptyComponent extends \Nette\Application\UI\Control
{
    /** @var string */
    private $message = NULL;
    /**
     *
     * @param type $message
     */
    public function __construct($message = NULL)
    {
        $this->message = $message;
    }
    /**
     *
     * @return type
     */
    public function render()
    {
        echo $this->message;
    }
}

Následná úprava továrničky v presenteru:

protected function createComponentGrid($name)
{
  try
  {
    $grid = new \UzivatelGrid();
    $gout = $grid->getDefault();
    $gout->getCount(); //tohle je tu z duvodu, aby se poslal nejaky dotaz do db a mohli jsme zde zachytit pripadnou chybu
    parent::addComponent($gout, $name);

    return $gout;
  }
  catch (\Exception $e)
  {
    return new \EmptyComponent('Grid nelze zobrazit');
  }
}

Tato kombinace je již plně funkční a dostatečně vyřešila moje požadavky na odchycení vyjímky s vykreslením zbytku obsahu stránky. Nette je spokojené - dostane vždy komponentu, kterou může vykreslit a já také, protože kvůli jednomu gridu neodstřelím celou stránku webu.

Závěrečné poděkování

pomohlo vám to? inspirovali jste se? Děkuji a neváhejte se podělit o své zkušenosti v komentářích.

 

Podobné články jako "Nette Grido a zachytávání vyjímek"

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.