2012-02-03 37 views
5

如何使用依賴注入將服務注入到實體存儲庫中?如何將服務注入實體存儲庫Symfony2原則?

我嘗試這樣的:

<service id="rp.repository.user" class="RP\CoreBundle\Repository\UserRepository" 
factory-service="doctrine.orm.entity_manager" factory-method="getRepository"> 
    <call method="setSecurityContext"> 
    <argument type="service" id="security.context"/> 
    </call> 
</service> 

但它從來沒有所謂的 PLZ setSecurityContext幫助

+0

我不知道我想做什麼是件好事。我想要訪問存儲庫中的安全上下文來檢查當前用戶是否具有role_user或不在所有dql請求中添加某個過濾器。與DI我是不可能的,因爲實體管理器調用getRepository函數並實例化請求的存儲庫,不從容器中獲取它,有人對此問題有想法? thx很多 – EAdel 2012-02-03 15:13:37

回答

8

注射服務爲一體的倉庫不推薦,因爲它打破了關注點分離。相反,您應該使用調用存儲庫的服務類。根據您的評論,簡單的工作流程將如下所示:

  • 定義UserService類,並將其註冊爲服務。
  • Inject security.context into UserService
  • 定義UserService::getUsers()(或任何你想要的方法)。在此方法中,您將使用security.context來設置查詢條件。您可以將條件直接傳遞給UserRepository::getUsers()方法,也可以在UserService對象中構建DQL並將其傳遞給UserRepository
  • UserService::getUsers()返回任何UserRepository::getUsers()返回。

這就是我喜歡處理這些情況的方式,但爲了完整起見,您還可以在存儲庫中使用簡單的setter注入。您可以通過實體管理器(而不是您的問題中的服務容器)獲取存儲庫,只需撥打$userRepository->setSecurityContext($this->get('security.context'))即可。

+0

,並且如果需要的話,可以提供例外嗎? – GorillaApe 2012-05-02 20:35:35