代码之家  ›  专栏  ›  技术社区  ›  user1788078

Zend框架2:“Zend\Form\FormInterface”的类型为“NULL”的实例化器无效

  •  0
  • user1788078  · 技术社区  · 11 年前

    由于一个奇怪的异常,我无法通过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 回复  |  直到 11 年前
        1
  •  1
  •   Ocramius    11 年前

    我深入研究了这个问题,实际上抛出了一个异常。尝试运行以下操作:

    $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 strategy ) prepareElement 在接口中定义 Zend\Form\ElementPrepareAwareInterface ,从那以后 2.1.0 .

    由于注入方法标记为由调用 Zend\迪 在对象被实例化之后, Zend\迪 在此未能找到 Zend\Form\FormInterface (事实并非如此 Zend\Form\Form ).

    所以正如你所看到的,变化与 Zend\迪 在这种情况下。你最终可能 report it 或者改变反省策略以满足你的需求。

    我个人认为 Zend\迪 应调用该方法,也不应将该方法作为 *Aware* 界面