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())
;
}]),
我正在使用 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())
;
}]),