EasyAdmin 3: limita i dati all'utente che ha effettuato l'accesso mostra ancora altri dati nei menu a discesa dei moduli

Aug 17 2020

Sto usando Symfony 5.

Voglio che ogni utente connesso abbia il proprio spazio in EasyAdmin 3, quindi nessun utente vedrà i record di altri utenti. Memorizzo l'utente con ogni tabella nel database.

Per semplici visualizzazioni elenco, sono riuscito a farlo funzionare utilizzando un'estensione di 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;
    }
}

Memorizzo/controllo anche l'utente tramite un file EventSubscriber.

Il problema è che alcuni moduli hanno una relazione con un'altra entità (come AssociationField::new('food')) e quando si riempiono i menu a discesa ignora la mia nuova funzione. Quindi vedrai i record appartenenti a un altro utente.

Come posso sovrascrivere questi menu a discesa per mostrare anche solo i dati appartenenti all'utente corrente?

Risposte

1 Oli Aug 17 2020 at 14:24

Ho trovato la soluzione: passare una query personalizzata al campo sottostante EntityTypedi 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())
        ;
}]),