Symfony2: Asignar el usuario logueado a una entidad automáticamente

Es posible que en nuestra aplicación tengamos algunas Entities que dependen del usuario que está conectado, es decir, tienen un atributo $user, por ejemplo, que debe almacenar al usuario de la sesión. Vamos a ver una forma de hacer esto automáticamente con los eventos de Doctrine.

Lo primero que haremos será crearnos una interfaz UserAware:

Y la implementamos en las entities en las que guardamos el usuario, por ejemplo:

Ahora ya sólo nos queda la parte del listener de Doctrine. En el listener lo que haremos será mirar si la entidad que se va a persistir implementa la interfaz UserAware, en cuyo caso se le asignará el usuario de la sesión. Aquí hay un problema y es que no se puede crear un Listener de Doctrine e inyectarle el servicio security.context para recuperar al usuario porque nos da un error de dependencia circular. Una de las opciones es crearnos un servicio aparte del que podamos recuperar el usuario y este servicio será el que inyectemos al Listener de Doctrine. Vamos a usar la implementación que tienen en DoctrineBehaviours de esto:

Y declaramos este servicio:

Ahora ya podemos crear nuestro Listener en Doctrine:

Y declararlo como servicio con el tag para que doctrine sepa que es un subscriber:

Ahora, cada vez que se persista una entidad que implemente la interfaz UserAware, se le asignará automáticamente el usuario de la sesión.