Symfony2 – Crea un filtro de Doctrine para seleccionar datos de usuario actuales

Estoy construyendo una aplicación Saas / Multitenant utilizando Symfony 2. Creé un evento-suscriptor de Doctrine para agregar y actualizar el propietario de una fila, el usuario que la creó, el usuario que la modificó, las marcas de tiempo y demás.

Y ahora necesito implementar algún tipo de filtro para que cuando un usuario inicie sesión, solo pueda ver datos de su compañía. Lo primero que hice fue usar un evento Doctrine preLoad, pero este evento no existe … Hasta donde yo sé, debo usar los filtros Doctrine, ¿no es así? De ser así, ¿cómo puede este filtro acceder a los datos del usuario para leer la identificación de la empresa? ¿Debo inyectarlo usando la Inyección de Dependencia? ¿Hay alguna manera estándar de lograr mi objective?

ACTUALIZAR Lo que estoy buscando es crear algún tipo de complemento / complemento de Doctrine, así que cada vez que llamo a cualquier función que obtenga datos de la base de datos (find, findOneBy, etc.), y la entidad que estoy buscando implementa una interfaz particular, una La secuencia SQL extra ‘AND company_id =: id’ se agrega a la consulta generada, por lo que ni el controlador ni el modelo reciben datos de otras compañías.

Para esto puede usar un enlace DoctrineFilter desde el documento oficial Doctrine2 SQL Filters

namespace Rwmt\Bundle\RwmtBundle\DoctrineFilters; use Doctrine\ORM\Mapping\ClassMetaData, Doctrine\ORM\Query\Filter\SQLFilter; class MultiTenantFilter extends SQLFilter { public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias) { // Check if the entity implements the MultiTenant interface if (!$targetEntity->reflClass->implementsInterface('Rwmt\Bundle\RwmtBundle\Entity\MultiTenant')) { return ""; } return $targetTableAlias.'.tenant_id = ' . $this->getParameter('tenantId'); } } 

Y para establecer el parámetro tenantId utilizado en el filtro debe habilitar el filtro y establecer el parámetro

 $filter = $em->getFilters()->enable('multi_tenant'); $filter->setParameter('tenantId', $tenant->getId(), 'integer'); 

En cuanto a la interfaz MultiTenant, es algo que las entidades deben implementar

 namespace Rwmt\Bundle\RwmtBundle\Entity; use Rwmt\Bundle\RwmtBundle\Entity\Tenant; interface MultiTenant { public function setTenant(Tenant $tenant); public function getTenant(); } 

Filtrar en Doctrine2 es simple. Simplemente asigne una función de filtro a una variable, luego envíe esa variable como un parámetro a través del método filter () incluido en la clase ArrayCollection.

 $closure = function($list_item) use($user) { return $list_item->belongsToSameCompanyThatEmploys($user) === true; }; $filtered_array_collection = $arrayYouWantToFilter->filter($closure); 

En este ejemplo, tendría que haber definido previamente un método belongsToSameCompanyThatEmploys($user) en la clase de list_item que devuelve true si pertenece a la misma empresa para la que trabaja el usuario.

UPDATE También debe indicar que la función de filtro debe usar el usuario variable local, ya que de lo contrario no tendrá su propio scope.