2012-02-03 12 views
5

¿cómo puedo inyectar un servicio en un repositorio de entidades con la inyección de dependencia?¿cómo puedo inyectar un servicio en un repositorio de entidades Doctrina Symfony2?

Trato de esta manera:

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

pero el setSecurityContext nunca llama plz ayuda

+0

no sé si lo que quiero hacer es bueno o no. Quiero acceder al contexto de seguridad en el repositorio para verificar si el usuario actual tiene el role_user o no para agregar algún filtro en todas las solicitudes de dql. con DI, no es posible porque el administrador de entidades llama a la función getRepository y crea una instancia del repositorio solicitado, no lo obtiene del contenedor, ¿alguien tiene una idea para este problema? thx mucho – EAdel

Respuesta

8

La inyección de un servicio en un repositorio no es recomendable, ya que rompe la separación de intereses. En su lugar, debe usar una clase de servicio que llame al repositorio. Basado en su comentario, un sencillo flujo de trabajo se vería así:

  • UserService Definir clase, y registrarlo como un servicio.
  • security.context Inyectar en UserService
  • UserService::getUsers() Definir (o como quiera que el método sea). Es aquí en el método que usaría security.context para establecer los criterios para la consulta. Puede pasar los criterios directamente a su método UserRepository::getUsers(), o construir el DQL en el objeto UserService y pasarlo al UserRepository.
  • UserService::getUsers() devuelve lo que UserRepository::getUsers() devuelve.

Así es como me gusta manejar situaciones como estas, pero, para completar, también podría usar una inyección setter simple en su repositorio. Buscaría el repositorio a través del administrador de entidades (y no del contenedor de servicios como en su pregunta), y simplemente llame al $userRepository->setSecurityContext($this->get('security.context')).

+0

y propably una excepción si es necesario? – GorillaApe

Cuestiones relacionadas