Komponowanie prezenterów z cech

Jeśli potrzebujemy zaimplementować ten sam kod w wielu prezenterach (np. w celu sprawdzenia, czy użytkownik jest zalogowany), sugeruje się umieszczenie kodu we wspólnym przodku. Inną opcją jest tworzenie cech jednozadaniowych.

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;
}