在Symfony2的項目中得到教訓,當你使用控制器,您可以通過調用getDoctrine()
上this
訪問主義,即:Symfony2的:在一個通用的PHP類
$this->getDoctrine();
這樣,我可以訪問這樣一個主體實體的存儲庫。
假設在Symfony2項目中有一個通用的PHP類。我如何檢索Doctrine? 我想有這樣的服務來獲得它,但我不知道哪一個。
在Symfony2的項目中得到教訓,當你使用控制器,您可以通過調用getDoctrine()
上this
訪問主義,即:Symfony2的:在一個通用的PHP類
$this->getDoctrine();
這樣,我可以訪問這樣一個主體實體的存儲庫。
假設在Symfony2項目中有一個通用的PHP類。我如何檢索Doctrine? 我想有這樣的服務來獲得它,但我不知道哪一個。
您可以將此課程註冊爲service並向其中注入其他任何服務。假設你有GenericClass.php如下:
class GenericClass
{
public function __construct()
{
// some cool stuff
}
}
你可以把它作爲服務註冊(在你的包的Resources/config/service.yml|xml
通常情況下),並注入主義的實體管理器進去:
services:
my_mailer:
class: Path/To/GenericClass
arguments: [doctrine.orm.entity_manager]
,它會嘗試將實體管理器注入(默認)GenericClass
的構造函數。所以,你只需要添加的說法吧:
public function __construct($entityManager)
{
// do something awesome with entity manager
}
如果你不知道什麼服務在您的應用程序的DI容器可用,您可以通過使用命令行工具找出:php app/console container:debug
,它會列出所有可用服務以及他們的別名和類。
檢查symfony2文檔後,我想出瞭如何在自定義方法中傳遞服務 以打破默認行爲。
重寫你的configs像這樣:
services:
my_mailer:
class: Path/To/GenericClass
calls:
- [anotherMethodName, [doctrine.orm.entity_manager]]
因此,該服務現已在你的其他方法可用。
public function anotherMethodName($entityManager)
{
// your magic
}
Ondrej的答案是絕對正確的,我只是想把這塊拼圖添加到這個線程。
這將注入EntityManager。我如何通過它獲取存儲庫?在一個控制器中,我可以得到如下庫:'$ this-> getDoctrine() - > getRepository('AcmeUserBundle:Address');',我也可以得到EntityManager,如下所示:'$ this-> getDoctrine() - > getEntityManager()'。但是,已知EntityManager,我如何獲取存儲庫?如果可以的話,答案就是你的! – JeanValjean 2012-08-10 17:34:07
如果您查看'Controller'類中的'getDoctrine',它只是調用'$ this-> container-> get('doctrine')'。所以你可以對你的服務做同樣的事情(注入'doctrine')。但你可以通過調用'$ entityManager-> getRepository('...')來實現。 – 2012-08-10 17:42:27
太棒了!非常明確的解釋雙+1。 – JeanValjean 2012-08-10 17:45:38