EasyAdmin 3: limiter les données à l'utilisateur connecté affiche toujours d'autres données dans les listes déroulantes du formulaire

Aug 17 2020

J'utilise Symfony 5.

Je souhaite que chaque utilisateur connecté ait son propre espace dans EasyAdmin 3, afin qu'aucun utilisateur ne voie les enregistrements des autres utilisateurs. Je stocke l'utilisateur avec chaque table de la base de données.

Pour les vues de liste simples, j'ai réussi à faire fonctionner cela en utilisant une extension de 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;
    }
}

Je stocke/vérifie également l'utilisateur via un fichier EventSubscriber.

Le problème est que certains formulaires ont une relation avec une autre entité (comme AssociationField::new('food')) et lors du remplissage des listes déroulantes, il ignore ma nouvelle fonction. Ainsi, vous verrez des enregistrements appartenant à un autre utilisateur.

Comment remplacer ces listes déroulantes pour afficher uniquement les données appartenant à l'utilisateur actuel ?

Réponses

1 Oli Aug 17 2020 at 14:24

J'ai trouvé la solution : passez une requête personnalisée au EntityTypechamp sous-jacent de 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())
        ;
}]),