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

Posted

技术标签:

【中文标题】EasyAdmin 3:限制登录用户的数据仍然在表单下拉列表中显示其他数据【英文标题】:EasyAdmin 3: limit data to the logged-in user still shows other data in form dropdowns 【发布时间】:2020-12-05 21:37:42 【问题描述】:

我正在使用 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】:

我找到了解决方案:将自定义查询传递给 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())
        ;
]),

【讨论】:

以上是关于EasyAdmin 3:限制登录用户的数据仍然在表单下拉列表中显示其他数据的主要内容,如果未能解决你的问题,请参考以下文章

功能测试 EasyAdmin 3 后端

EasyAdmin 3.1 CrudControllers Symfony

easyadmin写入无效

如何在 Symfony EasyAdmin 3 中创建数据验证系统

Symfony 5 easyadmin 3 与 ManyToOne 关系的实体 - 不保存在“多”端

EasyAdmin 3翻译错误,“翻译”字段的Doctrine类型为“4”,EasyAdmin尚不支持