2017-07-17 32 views
1

我重構了一些soap服務,其中靜態方法用於記錄和調用數據庫實例。這是一個定製的代碼,而不是框架。 db是單身所以它有對象調用:如何正確使用Symfony DI服務容器?

Db->getInstance()->prepare("some pepared statement"); 

和記錄儀正常靜態方法:

Logger::log("Some log massage!"); 

我想改變這一切,我實現了Symfony的服務容器,並註冊這兩個服務:

$container->register('Logger', 'Helpers\LogHelpers\LogManager'); 
    $container->register('Db', 'Helpers\ConfigHelpers\Db'); 

現在我應該將這些服務注入到項目中的所有類中,還是有辦法從某個全局變量中使用這些服務?我可以靜態地從容器中調用服務,但是製作容器有什麼意義呢?我在問這個問題,因爲在任何地方注入它似乎都很複雜。另一種方式是註冊的所有類與記錄器和Db依賴這樣的服務:

 $container->register('SKSPartner', 'Partners\SKSPartner')->setArguments([ 
     new Reference('SKSSoapClient'), 
     new Reference('Db'), 
     new Reference('Logger'), 
     new Reference('ServerManager') 
    ]); 
    $container->register('ThirdPartyIntegrationPartner', 'Partners\ThirdPartyIntegrationPartner')->setArguments([ 
     new Reference('ThirdPartyIntegrationSoapClient'), 
     new Reference('Db'), 
     new Reference('Logger'), 
     new Reference('ServerManager') 
    ]); 

,然後使用這些大類的服務。但是,然後項目的所有部分將成爲服務。據我所知,在服務容器中,應該只註冊將作爲Logger和Db一次又一次使用的類/服務?一些幫助在這裏將不勝感激。

+0

你的理解是,只有可重用服務應該被定義是不正確的。理想情況下,服務的所有用戶也將是服務。接受的答案建議有其他方法,但請確保您使用它們是出於正確的原因。 – Cerad

+0

@Cerad我現在試着使用只有可重用服務(Db和Logger)的方法,老實說,感覺不對。我不得不在很多地方注入服務。我將嘗試使所有服務都成爲服務,並且Db和Logger將成爲容器本身定義的依賴關係(就像我上面的第二個示例中那樣)。謝謝! – belijja

回答

0

讓他們到處注射是本書的一部分,但是,我明白必須到處去做這件事的麻煩。你有沒有試過調查Symfony service Autowiring?那一個可能在這種情況下非常方便。

另一種方法,你提到的,有一個全局變量,你可以根據需求提取服務,這基本上是你的容器,但是全局的。但事實是,在DI模式中,注入(並且更少使用全局)容器是非常令人沮喪的。注入容器因爲非常容易創建依賴性引用循環而不鼓勵,而全局容器因爲無法正確編寫模擬測試。

希望這會有所幫助...

+0

所以基本上我應該嘗試使用自動佈線或注入記錄器和Db到所有類。使用Db,Logger和所有其他依賴項將所有類註冊爲服務的方法都是錯誤的。此外,使容器全局化的唯一方法是使用一些靜態方法,其中容器應該是這樣,但它也是錯誤的,並且沒有改變,然後使用靜態方法來獲取Logger和Db,就像在項目的第一個版本中一樣。我會嘗試首先實現自動佈線以查看它的工作原理。謝謝,我現在有一些工作要做! – belijja