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是在 interface 中定义的Zend\Form\ElementPrepareAwareInterface,并且因为2.1.0.

由于注入方法被标记为Zend\Di在对象实例化后调用,Zend\Di因此无法找到Zend\Form\FormInterface(不是Zend\Form\Form)的实例。

如您所见,在这种情况下,更改与此无关Zend\Di。您最终可以报告它或更改内省策略以满足您的需求。

我个人认为不Zend\Di应该调用该方法,也不认为该方法应该是*Aware*接口的一部分。

于 2013-02-19T08:39:53.040 回答