EasyAdmin 3:ログインしたユーザーにデータを制限すると、フォームのドロップダウンに他のデータが表示されます
Aug 17 2020
私はSymfony5を使用しています。
ログインしたすべてのユーザーにEasyAdmin3に独自のスペースを持たせて、他のユーザーのレコードが表示されないようにします。データベース内のすべてのテーブルでユーザーを保存します。
単純なリストビューの場合、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())
;
}]),