我深入研究了這個,實際上拋出了一個異常。嘗試運行以下:
$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\Di
調用,Zend\Di
特此沒有找到一個實例Zend\Form\FormInterface
(其不是Zend\Form\Form
)。
因此,您可以看到在這種情況下,更改與Zend\Di
無關。你最終可以通過report it或改變內省策略來滿足你的需求。
我個人不認爲Zend\Di
應該調用該方法,也不應該該方法應該是接口的一部分。
對不起,我沒有指定ZF2版本。版本2.1.1發生此問題。我必須說,在2.0.7版本中,我的代碼運行良好。更新到ZF 2.1.1後,我得到了這個崩潰 – user1788078 2013-02-19 07:50:16