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

Я использую 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')) и при заполнении раскрывающихся списков игнорируют мою новую функцию. Так вы увидите записи, принадлежащие другому пользователю.

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


person Oli    schedule 16.08.2020    source источник


Ответы (1)


Я нашел решение: передать собственный запрос в нижележащее поле 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())
        ;
}]),
person Oli    schedule 17.08.2020