2013-12-21 84 views
1

我想覆蓋我的Symfony2項目中的默認Doctrine\ORM\EntityRepository類,以便我可以訪問@session服務,以便我的所有存儲庫都可以訪問某個會話變量(如果已設置)。將@session注入EntityRepository

在調查中,它似乎並不像我所希望的那麼簡單,因爲EntityRepository是從Doctrine\ORM\EntityManager中實例化的,並且此類使用靜態「create」方法實例化。

我跟着Injecting dependency into entity repository的答案,但在實際執行自定義管理器類(具體在哪裏,答案的作者說,「但既然你正在做一個自定義的實體管理器,你就可以將它的服務容器都創下了路障並注入你需要的任何依賴關係「)。

我定義了我重寫的EntityManager類,並重寫了「create」函數並重寫了「getRepository」函數。正是在這個函數中,我相信我需要將會話添加到Repository中,因爲它是使用重寫的EntityRepository類中的「setSession」方法創建的,但我不確定如何將會話實際導入到管理器中第一個地方,因爲EntityManager類的其他構造函數參數(Connection $conn, Configuration $config, EventManager $eventManager)在Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension「ormLoad」方法中提供。

我也以我的config.yml文件中指定

doctrine.orm.entity_manager.class: Me\MyBundle\Doctrine\ORM\EntityManager 

如何在創建存儲庫時讓Symfony使用我的自定義EntityManager類,並將該會話注入到它中?

回答

1

我結束了東西稍微不同的打算:

我推翻了doctrine.orm.entity_manager.class參數與我的自定義類的簡單擴展默認類的附加$session參數(完整的getter和setter),與重寫create和沿getRepository函數(返回情況下我的課,而不是默認的。

然後我重寫了EntityRepository類並實現了返回

一「的getSession」方法

最後,在訪問實體管理器自定義事件監聽器,我叫

$this->entityManager->setSession($session); 

這給了我從每一個存儲庫訪問會話。

3

弗洛裏安,here,解釋如何通過服務創造庫:

my_service: 
    class: Doctrine\Common\Persistence\ObjectRepository 
    factory_service: doctrine # this is an instance of Registry 
    factory_method: getRepository 
    arguments: [ %mytest.entity% ] 

你可以添加calls調用setSession(爲遞延DI):

my_service: 
    ... 
    calls: 
     - [setSession, ["@session"]] 

這是你試圖做什麼?

+0

這就是我想要做的事情,但我需要讓我的自定義EntityManager類成爲默認的EntityManager,所以我不知道如何去告訴Doctrine使用我的而不是他們的 – tanGee