2012-08-10 42 views
4

在Symfony2的項目中得到教訓,當你使用控制器,您可以通過調用getDoctrine()this訪問主義,即:Symfony2的:在一個通用的PHP類

$this->getDoctrine(); 

這樣,我可以訪問這樣一個主體實體的存儲庫。

假設在Symfony2項目中有一個通用的PHP類。我如何檢索Doctrine? 我想有這樣的服務來獲得它,但我不知道哪一個。

回答

11

您可以將此課程註冊爲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,它會列出所有可用服務以及他們的別名和類。

+0

這將注入EntityManager。我如何通過它獲取存儲庫?在一個控制器中,我可以得到如下庫:'$ this-> getDoctrine() - > getRepository('AcmeUserBundle:Address');',我也可以得到EntityManager,如下所示:'$ this-> getDoctrine() - > getEntityManager()'。但是,已知EntityManager,我如何獲取存儲庫?如果可以的話,答案就是你的! – JeanValjean 2012-08-10 17:34:07

+1

如果您查看'Controller'類中的'getDoctrine',它只是調用'$ this-> container-> get('doctrine')'。所以你可以對你的服務做同樣的事情(注入'doctrine')。但你可以通過調用'$ entityManager-> getRepository('...')來實現。 – 2012-08-10 17:42:27

+0

太棒了!非常明確的解釋雙+1。 – JeanValjean 2012-08-10 17:45:38

1

檢查symfony2文檔後,我想出瞭如何在自定義方法中傳遞服務 以打破默認行爲。

重寫你的configs像這樣:

services: 
my_mailer: 
    class: Path/To/GenericClass 
    calls: 
     - [anotherMethodName, [doctrine.orm.entity_manager]] 

因此,該服務現已在你的其他方法可用。

public function anotherMethodName($entityManager) 
{ 
    // your magic 
} 

Ondrej的答案是絕對正確的,我只是想把這塊拼圖添加到這個線程。