EasyAdmin 3: ограничить данные для вошедшего в систему пользователя по-прежнему показывает другие данные в раскрывающихся списках формы

Aug 17 2020

Я использую Symfony 5.

Я хочу, чтобы у каждого вошедшего в систему пользователя было собственное пространство в EasyAdmin 3, чтобы ни один пользователь не видел записи других пользователей. Я храню пользователя с каждой таблицей в базе данных.

Для простых представлений списка мне удалось заставить это работать, используя расширение 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;
    }
}

Я также храню / проверяю пользователя через файл EventSubscriber.

Проблема в том, что некоторые формы имеют отношение к другому объекту (например, AssociationField::new('food')) и при заполнении раскрывающихся списков игнорируют мою новую функцию. Так вы увидите записи, принадлежащие другому пользователю.

Как мне переопределить эти раскрывающиеся списки, чтобы также отображать только данные, принадлежащие текущему пользователю?

Ответы

1 Oli Aug 17 2020 at 14:24

Я нашел решение: передать пользовательский запрос в базовое EntityTypeполе 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())
        ;
}]),