Sestavljanje predavateljev iz lastnosti

Če moramo isto kodo implementirati v več prikazovalnikih (npr. preverjanje, ali je uporabnik prijavljen), je skušnjava, da bi kodo prenesli v skupnega prednika. Druga možnost je, da ustvarimo enonamenske lastnosti.

Prednost te rešitve je, da lahko vsak predstavnik uporablja samo lastnosti, ki jih dejansko potrebuje, medtem ko večkratno dedovanje v PHP ni mogoče.

Te lastnosti lahko izkoristijo dejstvo, da se ob ustvarjanju predstavnika zaporedno kličejo vse metode inject. Poskrbeti morate le, da je ime vsake metode inject edinstveno.

Značilnosti lahko inicializacijsko kodo obesijo v dogodka onStartup ali onRender.

Primeri:

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

Voditelj nato preprosto uporabi te lastnosti:

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