Składanie presenterów z traitów

Jeśli potrzebujemy w wielu presenterach zaimplementować ten sam kod (np. weryfikację, czy użytkownik jest zalogowany), można umieścić kod we wspólnym przodku. Drugą możliwością jest stworzenie jednofunkcyjnych traitów.

Zaletą tego rozwiązania jest to, że każdy z presenterów może użyć dokładnie tych traitów, których rzeczywiście potrzebuje, podczas gdy wielokrotne dziedziczenie nie jest możliwe w PHP.

Te traity mogą wykorzystywać fakt, że przy tworzeniu presentera kolejno wywoływane są wszystkie metody inject. Trzeba tylko dopilnować, aby nazwa każdej metody inject była unikalna.

Traity mogą dołączyć kod inicjalizacyjny do zdarzeń 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);
		};
	}
}

Presenter następnie po prostu używa tych traitów:

class ArticlePresenter extends Nette\Application\UI\Presenter
{
	use StandardTemplateFilters;
	use RequireLoggedUser;
}