2013-02-19 42 views
0

由於奇怪的異常,我無法通過DI實例化我的表單。Zend框架2:「Zend Form FormInterface」類型爲「NULL」的無效實例化器

這裏是代碼片段重現例外,我得到了

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'); 

我總是

Fatal error: Uncaught exception 'Zend\Di\Exception\RuntimeException' with message 'Invalid instantiator of type "NULL" for "Zend\Form\FormInterface".'

我在做什麼錯?任何幫助和/或建議非常感謝。

+0

對不起,我沒有指定ZF2版本。版本2.1.1發生此問題。我必須說,在2.0.7版本中,我的代碼運行良好。更新到ZF 2.1.1後,我得到了這個崩潰 – user1788078 2013-02-19 07:50:16

回答

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應該調用該方法,也不應該該方法應該是接口的一部分。