Presenterek összeállítása traitekkel
Ha több presenterben ugyanazt a kódot kell implementálnunk (pl. annak ellenőrzése, hogy a felhasználó be van-e jelentkezve), kézenfekvő a kódot egy közös ősbe helyezni. A második lehetőség egycélú traitek létrehozása.
Ennek a megoldásnak az az előnye, hogy minden presenter pontosan azokat a traiteket használhatja, amelyekre valóban szüksége van, míg a többszörös öröklődés PHP-ban nem lehetséges.
Ezek a traitek kihasználhatják azt a tényt, hogy a presenter létrehozásakor sorban meghívódnak az összes inject metódus. Csak arra kell ügyelni, hogy minden inject metódus neve egyedi legyen.
A traitek inicializáló kódot csatolhatnak az onStartup vagy onRender eseményekhez.
Példák:
trait RequireLoggedUser
{
public function injectRequireLoggedUser(): void
{
$this->onStartup[] = function () {
if (!$this->getUser()->isLoggedIn()) {
$this->redirect('Sign:in', $this->storeRequest());
}
};
}
}
trait StandardTemplateFilters
{
public function injectStandardTemplateFilters(TemplateBuilder $builder): void
{
$this->onRender[] = function () use ($builder) {
$builder->setupTemplate($this->template);
};
}
}
A presenter ezután egyszerűen használja ezeket a traiteket:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}