Nette Documentation Preview

syntax
inject
*************
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

injectメソッドと属性

この記事では、NetteフレームワークでPresenterに依存関係を渡すさまざまな方法に焦点を当てます。推奨される方法であるコンストラクタを、injectメソッドや属性などの他のオプションと比較します。

Presenterについても、コンストラクタ による依存関係の受け渡しが推奨される方法です。 しかし、他のPresenterが継承する共通の祖先(例:BasePresenter)を作成し、この祖先も依存関係を持っている場合、コンストラクタ地獄 と呼ばれる問題が発生します。 これは、injectメソッドと属性(アノテーション)という代替手段を使用して回避できます。

inject*() メソッド

これは、セッター による依存関係の受け渡しの一形態です。これらのセッターの名前は、接頭辞 inject で始まります。 Nette DIは、このように名付けられたメソッドをPresenterインスタンスの作成直後に自動的に呼び出し、必要なすべての依存関係を渡します。したがって、publicとして宣言する必要があります。

inject*() メソッドは、コンストラクタを複数のメソッドに拡張したものと考えることができます。これにより、BasePresenter は別のメソッドを介して依存関係を受け取り、コンストラクタをその子孫のために空けておくことができます。

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	private Foo $foo;

	public function injectBase(Foo $foo): void
	{
		$this->foo = $foo;
	}
}

class MyPresenter extends BasePresenter
{
	private Bar $bar;

	public function __construct(Bar $bar)
	{
		$this->bar = $bar;
	}
}

Presenterは任意の数の inject*() メソッドを持つことができ、各メソッドは任意の数のパラメータを持つことができます。これは、Presenterが トレイトで構成されている 場合や、各トレイトが独自の依存関係を必要とする場合に非常に便利です。

Inject 属性

これは、プロパティへのインジェクション の一形態です。どの変数にインジェクトするかを指定するだけで、Nette DIはPresenterインスタンスの作成直後に依存関係を自動的に渡します。それらを挿入できるようにするには、publicとして宣言する必要があります。

プロパティを属性でマークします:(以前はアノテーション /** @inject */ が使用されていました)

use Nette\DI\Attributes\Inject;  // この行は重要です

class MyPresenter extends Nette\Application\UI\Presenter
{
	#[Inject]
	public Cache $cache;
}

この依存関係の受け渡し方法の利点は、非常に簡潔な記述形式でした。しかし、コンストラクタプロパティプロモーション の登場により、コンストラクタを使用する方が簡単に見えます。

逆に、この方法は、一般的にプロパティへの依存関係の受け渡しと同じ欠点があります:変数内の変更を制御できず、同時に変数がクラスのパブリックインターフェースの一部となり、これは望ましくありません。