Comporre i presentatori dai tratti

Se abbiamo bisogno di implementare lo stesso codice in più presentatori (ad esempio, la verifica che l'utente sia connesso), siamo 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;
}