Presenter aus Traits zusammensetzen
Wenn wir in mehreren Presentern denselben Code implementieren müssen (z. B. die Überprüfung, ob der Benutzer angemeldet ist), bietet es sich an, den Code in einem gemeinsamen Vorfahren zu platzieren. Die zweite Möglichkeit ist die Erstellung von zweckgebundenen Traits.
Der Vorteil dieser Lösung ist, dass jeder der Presenter genau die Traits verwenden kann, die er tatsächlich benötigt, während Mehrfachvererbung in PHP nicht möglich ist.
Diese Traits können die Tatsache nutzen, dass bei der Erstellung des Presenters nacheinander alle inject-Methoden aufgerufen werden. Es muss nur sichergestellt werden, dass der Name jeder inject-Methode eindeutig ist.
Traits können Initialisierungscode an die Ereignisse onStartup oder onRender anhä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;
}