Nette Documentation Preview

syntax
トレイトからのPresenterの構成
*******************

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

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

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

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

例:

```php
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はこれらのトレイトを簡単に使用します:

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


{{sitename: ベストプラクティス}}

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