トレイトからのPresenterの構成

複数のPresenterで同じコードを実装する必要がある場合(例:ユーザーがログインしているかの検証)、コードを共通の祖先に配置することが考えられます。もう一つの選択肢は、単一目的のトレイトを作成することです。

この解決策の利点は、各Presenterが必要とするトレイトだけを使用できることです。一方、PHPでは多重継承は不可能です。

これらのトレイトは、Presenterが作成されるときに、すべての injectメソッド が順次呼び出されるという事実を利用できます。各injectメソッドの名前が一意であることを確認するだけで済みます。

トレイトは、onStartup または onRender イベントに初期化コードをフックすることができます。

例:

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

Presenterはこれらのトレイトを簡単に使用します:

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