2012-09-14 70 views
2

我有一個正在編寫測試的新模塊。 該模塊包含一個實現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是虛擬的。

有沒有人有任何其他想法?

回答

2

是的,你正朝着正確的方向前進。 (請參閱the preferences documentation

現在很多人都在使用DI來支持ServiceManager(包括我自己),但是如果DI的配置與ZF2 beta中的配置相似,則應該能夠添加一個「首選項」部分,將DI配置,如下所示:

'di' => array(
    'instance' => array(
     'preferences' => array(
      'My_Interface' => 'My_Implementation_Or_Alias', 
     ) 
    ) 
) 

該配置塊可以取代您的來電$di->instanceManager()->addTypePreference()


綜觀當前文檔和模仿的例子here,喲如果使用ZF2正式版本,您可能會成功定義DI配置,如下所示:

$di = new Zend\Di\Di; 
$di->configure(new Zend\Di\Config(array(
    'instance' => array(
     'preferences' => array(
      'My_Interface' => 'My_Implementation_Or_Alias', 
     ) 
    ) 
))); 
+0

是的,我注意到帶工廠的SM是在beta之後創建對象的首選方式。也許我會在稍後修改代碼。 – bedeabza

+0

DI是一個很新穎的想法,看到它真的很遺憾。如果你想長期保持你的DI配置,github上的Ocramius是一個有用的源碼(https://github.com/Ocramius/OcraDiCompiler)。他是DI的忠實粉絲。 – David

+0

我認爲PHP在DI中的主要問題是它必須在每個請求上進行重新處理,並且是流程密集型的權利?我只是在這裏猜測。當然你可以設置緩存,但對於我們這些只是試圖拾取Zend,它不是很容易設置。我認爲與服務經理一起去是一個好主意。它使事情更加明確,不那麼「神奇」。 –

1

你可以在這種情況下做什麼是以下內容。

在模塊單元測試的引導程序中,創建一個虛擬應用程序,該虛擬應用程序配置的配置只會加載正在測試的模塊。

...//other code before this for autoloading stuff 

// DON'T RUN THE application in your tests, just init it 
$application = Zend\Mvc\Application::init(include 'config/test.application.config.for.module.php'); 

$fullyConfigedManager = $application->getServiceManager(); 

TestCases::setServiceManager($fullyConfigedManager); 

在應用程序被boostrapped後,您可以直接從應用程序中拉出ServiceManager。該服務管理器應完全配置來自您的模塊的任何工廠,可調用的和配置。

+0

這會完成工作,但創建整個應用程序對象是沒有用的。相反,我通過手動創建一個帶有DI的SM來修復它。這裏的例子:https://github.com/bedeabza/BdzHtmlEmail/blob/master/tests/bootstrap.php – bedeabza