Zusammenstellung von Moderatoren aus Merkmalen

Wenn wir denselben Code in mehreren Presentern implementieren müssen (z. B. die Überprüfung, ob der Benutzer angemeldet ist), ist es verlockend, den Code in einem gemeinsamen Vorgänger zu platzieren. Die zweite Möglichkeit besteht darin, Einzweck-Traits zu erstellen.

Der Vorteil dieser Lösung ist, dass jeder Präsentator nur die Traits verwenden kann, die er tatsächlich benötigt, während Mehrfachvererbung in PHP nicht möglich ist.

Diese Traits können sich die Tatsache zunutze machen, dass alle Inject-Methoden bei der Erstellung des Presenters nacheinander aufgerufen werden. Sie müssen nur darauf achten, dass der Name jeder Inject-Methode eindeutig ist.

Traits können den Initialisierungscode in onStartup- oder onRender-Ereignisse einhängen.

Beispiele:

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

Der Vortragende nutzt dann einfach diese Eigenschaften:

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