【问题标题】:Zend framework 2: Invalid instantiator of type "NULL" for "Zend\Form\FormInterface"Zend 框架 2:“Zend\Form\FormInterface”的“NULL”类型的无效实例化器
【发布时间】:2013-02-19 07:39:00
【问题描述】:

由于奇怪的异常,我无法通过 DI 实例化我的表单。

这里是重现异常的代码 sn-p

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”类型的无效实例化器。'

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

【问题讨论】:

  • 对不起,我没有指定 ZF2 版本。版本 2.1.1 出现此问题。我必须说,在 2.0.7 版本中,我的代码运行良好。更新到 ZF 2.1.1 后我遇到了这个崩溃

标签: zend-form zend-framework2


【解决方案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 无关。您最终可以report it 或更改内省策略以满足您的需求。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多