Compunerea prezentatorilor din trăsături
Dacă trebuie să implementăm același cod în mai multe prezentări (de exemplu, verificarea faptului că utilizatorul este conectat), este tentant să plasăm codul într-un strămoș comun. A doua opțiune este de a crea trăsături cu scop unic.
Avantajul acestei soluții este că fiecare prezentator poate utiliza doar trăsăturile de care are nevoie efectiv, în timp ce moștenirea multiplă nu este posibilă în PHP.
Aceste trăsături pot profita de faptul că toate metodele de injectare sunt apelate secvențial atunci când este creat prezentatorul. Trebuie doar să vă asigurați că numele fiecărei metode inject este unic.
Traits pot agăța codul de inițializare în 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);
};
}
}
Prezentatorul folosește apoi pur și simplu aceste trăsături:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}