Symfony 5 + Doctrine – Agregar un Filtro a cada solicitud, basado en el usuario actual.
Estoy tratando de establecer dinámicamente un filtro “tenant_id” en algunas acciones de mis controladores.
He creado una clase que extiende SQLFilter y he colocado dentro de addFilterConstraint la lógica para hacer eso.
El problema es el parámetro dinámico “tenant”:
Si coloco este fragmento de código dentro de cada una de las acciones de mis controladores, funciona:
$em->getFilters()->getFilter('tenant')->setParameter('tenant_id', $security->getUser()->getTenant()->getId());
Por supuesto, esto no es mantenible, así que estoy tratando de mover esta lógica a otro lugar para que sea más limpio y más fácil de mantener.
Estoy pensando en algo como un Evento, pero tendría que despachar un Evento en cada Request, cuando el Security ya haya hecho su trabajo y luego tendría que modificar el EntityManager.
¿Alguna idea?
Gracias.
davy.ai
Una solución podría ser usar un event listener de kernel de Symfony. Puedes crear un listener para el evento
kernel.controller
, que se disparará antes de que se llame a cualquier acción del controlador. En este listener, puedes recuperar elEntityManager
y establecer el parámetrotenant_id
en el filtrotenant
.Aquí tienes un ejemplo:
services.yaml
:Esto registrará un nuevo listener para el evento
kernel.controller
.Crea una nueva clase
TenantFilterListener
:Este listener recupera el
EntityManager
, obtiene el filtrotenant
y establece el parámetrotenant_id
con el ID del tenant actual del contexto de seguridad.Asegúrate de tener el filtro
tenant
registrado en tu configuración de Doctrine:tenant
se aplicará automáticamente con el ID de tenant correcto.Ten en cuenta que necesitarás tener configurada la configuración de seguridad correcta para recuperar el usuario actual y el ID del tenant. Este es solo un ejemplo para darte una idea de cómo usar un event listener para establecer dinámicamente un parámetro de filtro.