09-08-2010 02:00 - Zdroj: php.vrana.cz
Představte si aplikaci podle návrhového vzoru MVC nebo podobného, napsanou třeba v Nette, ve které chceme někde v postranním menu zobrazit třeba výběr článků. Pokud se tento výběr nepodaří načíst, neměl by zamezit zobrazení hlavního obsahu stránky. Model může vypadat třeba takhle:
<?php
class Article {
static function findBests() {
return dibi::query("SELECT * FROM [article] WHERE [best]")->fetchAll();
}
}
?>
Prezenter:
<?php
class ArticlePresenter {
function renderDetail($id) {
// tady bude načtení hlavního obsahu stránky - detailu článku
// kromě toho načteme i výběr článků pro postranní menu
$this->template->bestArticles = Article::findBests();
}
}
?>
Šablona postranního menu:
{if $bestArticles}
<h3><a href="{link Article:bests}">Výběr článků</a></h3>
<ul>
{foreach $bestArticles as $article}
<li><a href="{link Article:detail $article->id}">{$article->title}</a></li>
{/foreach}
</ul>
{/if}
Zdrojový kód je k dispozici na GitHubu.
Jak je vidět, model používá Dibi, které v případě chyby vyvolá DibiException. A mě zajímá, jak s touto výjimkou naložíte. Ošetříte ji už v modelu, v prezenteru, nebo ji snad necháte probublat až na nejvyšší úroveň? A pokud ji nezachytíte už v modelu, použijete dokumentační komentář @throws? A nebude divné, že se prezenter prostřednictvím typu výjimky dozví o implementaci modelu? Nebo ji třeba v modelu přeložíte na jinou výjimku? A jak vlastně bude vypadat blok catch?
Všimněte si také toho, že v šabloně je odkaz na Article:bests – to bude stránka, kde je hlavním obsahem právě seznam nejlepších článků a kde je tedy žádoucí, aby skončila pětistovkou, pokud se seznam nepodaří načíst. A aby vypsala informaci o prázdném seznamu, pokud žádné články jako ... -
Pokračovat...