我对此进行了深入研究,确实引发了异常。尝试运行以下:
$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 自省策略而言)prepareElement
是在 interface 中定义的Zend\Form\ElementPrepareAwareInterface
,并且因为2.1.0
.
由于注入方法被标记为Zend\Di
在对象实例化后调用,Zend\Di
因此无法找到Zend\Form\FormInterface
(不是Zend\Form\Form
)的实例。
如您所见,在这种情况下,更改与此无关Zend\Di
。您最终可以报告它或更改内省策略以满足您的需求。
我个人认为不Zend\Di
应该调用该方法,也不认为该方法应该是*Aware*
接口的一部分。