EasyAdmin 3: จำกัด ข้อมูลให้กับผู้ใช้ที่เข้าสู่ระบบยังคงแสดงข้อมูลอื่น ๆ ในแบบฟอร์มดรอปดาวน์

Aug 17 2020

ฉันใช้ 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 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())
        ;
}]),