Komponowanie prezenterów z cech
Jeśli musimy zaimplementować ten sam kod w wielu prezenterach (np. weryfikacja, czy użytkownik jest zalogowany), kuszące jest umieszczenie kodu we wspólnym przodku. Drugą opcją jest stworzenie cech jednego przeznaczenia.
Zaletą tego rozwiązania jest to, że każdy prezenter może używać tylko cech, których faktycznie potrzebuje, podczas gdy wielokrotne dziedziczenie nie jest możliwe w PHP.
Te cechy mogą wykorzystać fakt, że wszystkie metody inject są wywoływane sekwencyjnie, gdy prezenter jest tworzony. Musisz tylko upewnić się, że nazwa każdej metody wtrysku jest unikalna.
Traits mogą powiązać kod inicjalizacyjny ze zdarzeniami onStartup lub onRender.
Przykłady:
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);
};
}
}
Prezenter wtedy po prostu wykorzystuje te cechy:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}