Comporre i presentatori dai tratti

Se occorre implementare lo stesso codice in più presentatori (ad esempio, la verifica che l'utente sia loggato), si è tentati di collocare il codice in un antenato comune. La seconda opzione è quella di creare tratti a scopo singolo.

Il vantaggio di questa soluzione è che ogni presentatore può utilizzare solo i tratti di cui ha effettivamente bisogno, mentre l'ereditarietà multipla non è possibile in PHP.

Questi tratti possono sfruttare il fatto che tutti i metodi di iniezione sono chiamati in sequenza quando il presentatore viene creato. È sufficiente assicurarsi che il nome di ogni metodo di iniezione sia unico.

I tratti possono appendere il codice di inizializzazione negli eventi onStartup o onRender.

Esempi:

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

Il presentatore utilizza semplicemente questi tratti:

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