我有一個正在編寫測試的新模塊。 該模塊包含一個實現ServiceLocatorAwareInterface的類,因爲它需要使用DI容器創建其他對象。ServiceLocatorAwareInterface在運行模塊測試時混淆了DI容器
的Zend \迪\異常\ RuntimeException的:爲「Zend的\的ServiceManager \ ServiceLocatorInterface」類型「NULL」的無效初始化程序
骨架中的應用程序運行的時候,但運行模塊測試時,我碰到下面的一切工作正常
研究一下我發現DI容器試圖創建一個類型爲「ServiceLocatorAwareInterface」的新對象,這當然是錯誤的。
在測試bootstrap中挖掘一點點,我發現添加下面的行可以解決這個問題,因爲DI現在知道該接口實例化的類。
$di->instanceManager()->addTypePreference('Zend\ServiceManager\ServiceLocatorInterface', new \Zend\ServiceManager\ServiceManager());
我不確定這是否是問題的最佳解決方案,因爲我通過的ServiceManager是虛擬的。
有沒有人有任何其他想法?
是的,我注意到帶工廠的SM是在beta之後創建對象的首選方式。也許我會在稍後修改代碼。 – bedeabza
DI是一個很新穎的想法,看到它真的很遺憾。如果你想長期保持你的DI配置,github上的Ocramius是一個有用的源碼(https://github.com/Ocramius/OcraDiCompiler)。他是DI的忠實粉絲。 – David
我認爲PHP在DI中的主要問題是它必須在每個請求上進行重新處理,並且是流程密集型的權利?我只是在這裏猜測。當然你可以設置緩存,但對於我們這些只是試圖拾取Zend,它不是很容易設置。我認爲與服務經理一起去是一個好主意。它使事情更加明確,不那麼「神奇」。 –