0

奇妙な例外のため、DI を介してフォームをインスタンス化できません。

これは、私が得た例外を再現するためのコードスニペットです

include 'Zend/Loader/AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array(
    'Zend\Loader\StandardAutoloader' => array(
        'autoregister_zf' => true
    )
));

include 'Zend/Di/Di.php';

$di = new Zend\Di\Di();
$form = $di->get('Zend\Form\Form');

私はいつも得る

致命的なエラー: キャッチされない例外 'Zend\Di\Exception\RuntimeException' とメッセージ 'Zend\Form\FormInterface のタイプ "NULL" のインスタンス化子が無効です。

私は何を間違っていますか?ヘルプや提案は大歓迎です。

4

1 に答える 1

1

これを掘り下げたところ、実際に例外がスローされました。以下を実行してみてください:

$def = new \Zend\Di\Definition\RuntimeDefinition();

var_dump($def->getMethods('Zend\Form\Form'));

Zend\Diこれにより、「注入メソッド」として理解されるすべてのメソッドがダンプされます。出力は次のようになります

array (size=23)
  '__construct' => boolean true
  'setData' => boolean false
  'setHydrator' => boolean false
  'setBindOnValidate' => boolean false
  'setBaseFieldset' => boolean false
  'setValidationGroup' => boolean false
  'setInputFilter' => boolean false
  'setUseInputFilterDefaults' => boolean false
  'setPreferFormInputFilter' => boolean false
  'setWrapElements' => boolean false
  'setOptions' => boolean false
  'setFormFactory' => boolean true
  'setPriority' => boolean false
  'setMessages' => boolean false
  'setObject' => boolean false
  'setUseAsBaseFieldset' => boolean false
  'setName' => boolean false
  'setAttribute' => boolean false
  'setAttributes' => boolean false
  'setValue' => boolean false
  'setLabel' => boolean false
  'setLabelAttributes' => boolean false
  'prepareElement' => boolean true

ご覧のとおり、メソッドprepareElement(FormInterface $form)はインジェクション メソッドとしてマークされています。これは、(現在のDi イントロスペクション戦略の時点で)prepareElementが interfaceZend\Form\ElementPrepareAwareInterfaceで定義されているため2.1.0です。

Zend\Diインジェクション メソッドは、オブジェクトがインスタンス化された後に呼び出されるようにマークされているため、 (ではない)Zend\Diのインスタンスを見つけることができません。Zend\Form\FormInterfaceZend\Form\Form

ご覧のとおりZend\Di、この場合、変更は関係ありません。最終的には報告するか、ニーズに合わせてイントロスペクション戦略を変更することができます。

個人的には、そのメソッドを呼び出すべきではないと思いますし、メソッドがインターフェイスZend\Diの一部であるべきだとも思いません。*Aware*

于 2013-02-19T08:39:53.040 に答える