Zend框架2:类型" NULL"的无效实例化器for" Zend \ Form \ FormInterface"

时间:2013-02-19 07:39:00

标签: zend-form zend-framework2

由于奇怪的异常,我无法通过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”的无效实例化器。'

我做错了什么?非常感谢任何帮助和/或建议。

1 个答案:

答案 0 :(得分: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 introspection strategyprepareElement在接口Zend\Form\ElementPrepareAwareInterface中定义,并且从2.1.0开始。

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

因此,在这种情况下,您可以看到更改与Zend\Di无关。您最终可以report it或改变内省策略以满足您的需求。

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