Compunerea presenterilor din trait-uri
Dacă avem nevoie să implementăm același cod în mai mulți presenteri (de ex. verificarea că utilizatorul este autentificat), o opțiune este plasarea codului într-un strămoș comun. A doua opțiune este crearea de trait-uri cu un singur scop.
Avantajul acestei soluții este că fiecare dintre presenteri poate folosi exact acele trait-uri de care are nevoie cu adevărat, în timp ce moștenirea multiplă nu este posibilă în PHP.
Aceste trait-uri pot profita de faptul că la crearea presenterului se apelează succesiv toate metodele inject. Este necesar doar să se asigure că numele fiecărei metode inject este unic pentru a evita conflictele.
Trait-urile pot atașa cod de inițializare la evenimentele onStartup sau onRender.
Exemple:
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);
};
}
}
Presenterul apoi utilizează simplu aceste trait-uri:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}