1

セッターがいくつかあるクラスがあり、セッターインジェクションを使用したいのですが、RuntimeDefinitionではトリガーされません。最初は不可能かもしれないと思っていましたが、Zend 2.1.0にアップグレードすると、新しいsetProfiler()メソッドが導入されたために他のクラスに注入されていたZend \ Db \ Adapter\Adapterでエラーが発生し始めました。 (デフォルトのRuntimeDefinitionを使用しながら)セッターインジェクションを実行しようとしています。私はAdapterのコードを調べましたが、そのコードと私のコードの唯一の違いは、setProfiler()メソッドに@paramを含むドキュメントコメントが含まれていることです。コードにいくつか追加しましたが、機能しません。明らかに私は何かが欠けています。DI定義ファイルにコンパイルしても、

'methods' => 
array (
  '__construct' => true,
  'setProfiler' => true,
)

私の定義は次のようになりますが:

'methods' => 
array (
  'setMyValue' => false,
)

Diにセッター関数を正しく識別させて、必要な値を挿入するために使用できるようにするにはどうすればよいですか?

4

1 に答える 1

1

クラスの内部をよく調べた後CompilerDefinition、私はそれを理解しました。

Zend \ Db \ Adapter \ Adapterの場合にセッターが呼び出される理由は、が原因ですProfiler\ProfilerAwareInterface

クラスがインターフェイスを実装し、そのインターフェイスにセッターがある場合、セッターが呼び出されるようです。実装されたインターフェース名が正規表現と一致する/\w*Aware\w*/ものであることも重要です。

このロジックの例は、ラルフシンドラーのZend\Diで見ることができます。

于 2013-02-11T14:08:08.123 に答える