トレイトからの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;
}