サービス定義
コンフィギュレーションは、DIコンテナに対して、個々のサービスの組み立て方や、他の依存関係との接続方法を指示する場所です。Netteは、これを実現するための非常に明確でエレガントな方法を提供します。
NEON設定ファイルのservices
セクションは、カスタムサービスとその設定を定義する場所です。PDO
クラスのインスタンスを表すdatabase
というサービスを定義する簡単な例を見てみましょう:
この設定により、DIコンテナのファクトリーメソッドは次のようになります:
サービス名は、設定ファイルの他の部分で参照できるようにするためのもので、@serviceName
.サービス名を付ける必要がない場合は、単に箇条書きを使用できます:
DIコンテナからサービスを取得するには、getService()
メソッドにサービス名をパラメータとして指定するか、getByType()
メソッドにサービスタイプを指定して指定します:
サービスクリエーション
ほとんどの場合、特定のクラスをインスタンス化するだけでサービスを作成します。例えば
追加のキーで設定を拡張する必要がある場合、定義を複数行に拡張することができます:
create
キーにはfactory
という別名がある。しかし、create
の使用を推奨する。
コンストラクタの引数や作成メソッドは、arguments
キーに記述することもできる:
静的メソッドや他のサービスのメソッドを呼び出すことによって生成されることもあります:
簡単にするために、->
の代わりに::
を使うことに注意。これらのファクトリーメソッドは生成されます:
DIコンテナは、作成されたサービスのタイプを知る必要がある。戻り値の型が指定されていないメソッドを使用してサービスを作成する場合は、設定にこの型を明示的に記述する必要があります:
引数
コンストラクタやメソッドに引数を渡す方法は、通常のPHPとよく似ています:
読みやすくするために、引数を別々の行に書くこともできます。この形式では、カンマの使用は任意です:
また、引数に名前を付けることもでき、その場合は順番を気にする必要はありません:
特定の引数を省略してデフォルト値を使用したい場合や、自動配線でサービスを挿入したい場合は、アンダースコアを使用します:
引数には、サービス、パラメータ、その他いろいろなものがあります。
セットアップ
setup
セクションでは、サービスを作成する際に呼び出されるメソッドを定義します。
PHPでは次のようになります:
メソッド呼び出しに加えて、プロパティに値を渡すこともできます。配列への要素の追加もサポートされていますが、NEON構文と衝突しないように引用符で囲む必要があります:
PHPでは次のようになります:
セットアップでは、静的メソッドや他のサービスのメソッドを呼び出すこともできます。現在のサービスを引数として渡す必要がある場合は、@self
:
簡単のため、->
の代わりに、::
を使用することに注意してください。これにより、以下のファクトリーメソッドが生成される:
表現方法
Nette DIは、非常に豊富な表現機能を備えており、ほとんど何でも表現することができます。設定ファイルでは、パラメータを使うことができます:
また、オブジェクトを作成したり、メソッドや関数を呼び出したりすることもできます:
サービスを名前またはタイプで参照する:
ファーストクラスの callable 構文を使用する:.{data-version:3.2.0}
定数を使用する:
Method calls can be chained, just like in PHP. For simplicity, instead of ->
, we use ::
:
これらの式は、サービスを作成する際、引数、設定セクション、パラメータなど、どこでも使用できます:
特殊機能
コンフィギュレーション・ファイル内では、これらの特殊関数を利用することができます:
not()
値の否定bool()
,int()
,float()
,string()
によるロスレス型キャストtyped()
指定された型のすべてのサービスの配列を生成する。tagged()
指定されたタグを持つすべてのサービスの配列を作成する。
(int)
のような PHP の従来の型キャストと比較すると、
ロスレス型キャストは数値以外の値に対して例外をスローします。
typed()
関数は、特定の型 (クラスまたはインターフェイス)
のすべてのサービスの配列を作成します。自動配線をオフにしたサービスは除外されます。複数の型をカンマ区切りで指定することができます。
また、自動配線を使用して、特定のタイプのサービスの配列を自動的に引数として渡すこともできます。
tagged()
関数は、指定されたタグを持つすべてのサービスの配列を作成します。複数のタグをカンマ区切りで列挙できます。
自動配線
autowired
キーにより、特定のサービスの自動配線の動作を変更することができます。詳細は自動配線の章を参照してください。
怠惰なサービス
遅延ロードは、実際に必要になるまでサービスの作成を遅らせるテクニックです。遅延サービス作成は、コンフィギュレーションですべてのサービスに対して一度にグローバルに有効にすることができます。個々のサービスでは、この動作をオーバーライドできます:
サービスが遅延サービスとして定義されている場合、DIコンテナからそのサービスをリクエストすると、特別なプロキシオブジェクトが返されます。このプロキシは実際のサービスのように見え、振る舞いますが、実際の初期化(コンストラクタの呼び出しとセットアップ)は、そのメソッドやプロパティを最初に呼び出したときにのみ行われます。
レイジーローディングを使用できるのはユーザー定義クラスのみで、 PHP の内部クラスには使用できません。PHP 8.4 以降が必要です。
タグ
タグはサービスに補足情報を追加するために使用します。サービスには1つ以上のタグを割り当てることができます.
タグは値を持つこともできます:
特定のタグを持つすべてのサービスを検索するには、tagged()
関数を使用できます:
DIコンテナでは、findByTag()
メソッドを使用して、特定のタグを持つすべてのサービス名を取得できます:
インジェクトモード
フラグinject: true
を使用すると、injectアノテーションとinject*()メソッドでパブリック変数を介した依存関係の受け渡しが有効になります。
デフォルトでは、inject
はプレゼンターに対してのみ有効です。
サービスの変更
DIコンテナには、組み込みまたはユーザーによる拡張によって追加された多くのサービスが含まれています。これらのサービスの定義は、コンフィギュレーションで直接変更できます。たとえば、従来はNette\Application\Application
であったapplication.application
サービスのクラスを別のものに変更することができます:
alteration
フラグは、単に既存のサービスを変更するだけであることを示す情報的なものである。
セットアップを補足することもできる:
サービスを上書きする際に、オリジナルの引数や設定項目、タグを削除したい場合があります。このような場合に便利なのが、reset
:
拡張機能によって追加されたサービスを削除したい場合は、次のようにします: