Presenter aus Traits zusammensetzen
Wenn Sie in mehreren Presentern denselben Code implementieren müssen (z. B. die Prüfung, ob der Benutzer angemeldet ist), bietet es sich an, den Code in einen gemeinsamen Vorfahren zu legen. Die zweite Möglichkeit ist, Traits mit einem einzigen Zweck zu erstellen.
Der Vorteil dieser Lösung ist, dass jeder Presenter genau die Traits verwenden kann, die er wirklich braucht, während Mehrfachvererbung in PHP nicht möglich ist.
Diese Traits können sich zunutze machen, dass beim Erzeugen des Presenters nacheinander alle Inject-Methoden aufgerufen werden. Sie müssen nur darauf achten, dass der Name jeder Inject-Methode über alle verwendeten Traits und den Presenter selbst hinweg eindeutig ist.
Traits können Initialisierungscode an die Events onStartup oder onRender hä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 Presenter verwendet diese Traits dann einfach:
class ArticlePresenter extends Nette\Application\UI\Presenter
{
use StandardTemplateFilters;
use RequireLoggedUser;
}