EasyAdmin 3: limite de dados para o usuário logado ainda mostra outros dados nos menus suspensos do formulário

Aug 17 2020

Estou usando o Symfony 5.

Eu quero que cada usuário logado tenha seu próprio espaço no EasyAdmin 3, então nenhum usuário verá registros de outros usuários. Eu armazeno o usuário com todas as tabelas do banco de dados.

Para exibições de lista simples, consegui fazer isso funcionar usando uma extensão do AbstractCrudController:

<?php
namespace App\Controller\Admin;

use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;

abstract class CustomCrudController extends AbstractCrudController
{
    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $qb->andWhere('entity.user = :user');
        $qb->setParameter('user', $this->getUser());
        return $qb;
    }
}

Eu também armazeno/verifico o usuário através de um arquivo EventSubscriber.

O problema é que alguns formulários têm uma relação com outra Entidade (como AssociationField::new('food')) e ao preencher os menus suspensos, ele ignora minha nova função. Então você verá registros pertencentes a outro usuário.

Como faço para substituir esses menus suspensos para mostrar apenas os dados pertencentes ao usuário atual?

Respostas

1 Oli Aug 17 2020 at 14:24

Encontrei a solução: passe uma consulta personalizada para o EntityTypecampo subjacente do Symfony.

AssociationField::new('food')
    ->setRequired(true)
    ->setFormTypeOptions(['query_builder' => function (EntityRepository $em) {
    return $em->createQueryBuilder('f')
        ->where('f.user = :user')
        ->orderBy('f.title', 'ASC')
        ->setParameter('user', $this->getUser())
        ;
}]),