2012-02-03 19 views
5

Come posso iniettare un servizio in un repository di entità con l'iniezione delle dipendenze?Come posso iniettare un servizio in un repository di entità Symfony2 doctrine?

provo in questo modo:

<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> 

ma il setSecurityContext non è mai chiamato plz help

+0

Non so se quello che voglio fare è una cosa buona o meno. Voglio accedere al contesto di sicurezza nel repository per verificare se l'utente corrente ha il ruolo_utente o meno per aggiungere un filtro in tutte le richieste dql. con la cosa di DI i non è possibile perché il gestore di entità chiama la funzione getRepository e crea un'istanza del repository richiesto, non la ottiene dal contenitore, qualcuno ha un'idea per questo problema? grazie mille – EAdel

risposta

8

Iniettando un servizio in un repository non è raccomandato, in quanto si rompe la separazione degli interessi. Invece, dovresti usare una classe di servizio che chiama il repository. Sulla base di un commento, un semplice flusso di lavoro sarebbe simile a questa:

  • Definire UserService di classe, e registrarlo come servizio.
  • Iniettare security.context in UserService
  • Definire UserService::getUsers() (o quello che volete il metodo di essere). È qui nel metodo che useresti security.context per impostare i criteri per la query. È possibile passare i criteri direttamente al metodo UserRepository::getUsers() o creare il DQL nell'oggetto UserService e passarlo a UserRepository.
  • UserService::getUsers() restituisce qualsiasi ritorno UserRepository::getUsers().

Questo è il modo in cui mi piace gestire situazioni come queste, ma per motivi di completezza, è possibile utilizzare anche l'iniezione semplice setter nel repository. Si dovrebbe recuperare il repository attraverso il gestore di entità (e non dal contenitore di servizi come nella domanda), e semplicemente chiamare $userRepository->setSecurityContext($this->get('security.context')).

+0

ed eventualmente un'eccezione se è richiesta? – GorillaApe

Problemi correlati