由于奇怪的异常,我无法通过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”的无效实例化器。'
我做错了什么?非常感谢任何帮助和/或建议。
答案 0 :(得分: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 strategy)prepareElement
在接口Zend\Form\ElementPrepareAwareInterface
中定义,并且从2.1.0
开始。
由于在实例化对象后,Zend\Di
标记了注入方法被Zend\Di
调用,因此Zend\Form\FormInterface
无法找到Zend\Form\Form
的实例(不是Zend\Di
})。
因此,在这种情况下,您可以看到更改与Zend\Di
无关。您最终可以report it或改变内省策略以满足您的需求。
我个人认为*Aware*
不应该调用该方法,也不应该认为该方法应该是{{1}}接口的一部分。