EasyAdmin 3:限制登录用户的数据仍然在表单下拉列表中显示其他数据

EasyAdmin 3: limit data to the logged-in user still shows other data in form dropdowns

我正在使用 Symfony 5。

我希望每个登录用户在 EasyAdmin 3 中都有自己的 space,这样任何用户都不会看到其他用户的记录。我将每个 table 的用户存储在数据库中。

对于简单的列表视图,我设法使用 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;
    }
}

我也store/check用户通过了EventSubscriber.

问题是,某些表单与另一个实体有关系(如 AssociationField::new('food')),并且在填充下拉列表时它会忽略我的新功能。所以你会看到属于另一个用户的记录。

如何覆盖这些下拉菜单以仅显示属于当前用户的数据?

我找到了解决方案:将自定义查询传递给 Symfony 的基础 EntityType 字段。

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())
        ;
}]),