EasyAdmin 3: verileri oturum açmış kullanıcıyla sınırlayın, diğer verileri form açılır listelerinde göstermeye devam edin

Aug 17 2020

Symfony 5 kullanıyorum.

Oturum açmış her kullanıcının EasyAdmin 3'te kendi alanına sahip olmasını istiyorum, böylece hiçbir kullanıcı diğer kullanıcıların kayıtlarını görmez. Kullanıcıyı veritabanındaki her tabloyla birlikte saklarım.

Basit liste görünümleri için, aşağıdakilerin bir uzantısını kullanarak bunu çalıştırmayı başardım 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;
    }
}

Ayrıca kullanıcıyı bir EventSubscriber.

Sorun şu ki, bazı formların başka bir Varlıkla (gibi AssociationField::new('food')) bir ilişkisi var ve açılır menüleri doldururken yeni işlevimi görmezden geliyor. Böylece başka bir kullanıcıya ait kayıtları göreceksiniz.

Yalnızca mevcut kullanıcıya ait verileri de göstermek için bu açılır menüleri nasıl geçersiz kılabilirim?

Yanıtlar

1 Oli Aug 17 2020 at 14:24

Çözümü buldum: EntityTypeSymfony'nin temel alanına özel bir sorgu iletin.

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