首页 > 解决方案 > EasyAdmin 3:用户角色过滤器显示以前过滤器的数据

问题描述

使用 EasyAdmin 3.xa 可以构建过滤器以按用户角色选择用户实体的列表视图。例如,如果角色是ROLE_REP,则使用实体的代表App\Entity\PersonCrudController 可能包含以下内容:

    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $role = serialize(["ROLE_REP"]);
        $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $qb->andWhere('entity.roles = :role');
        $qb->setParameter('role', $role);

        return $qb;
    }

如果使用相同实体的不同名称 CrudControllerApp\Entity\Person尝试使用$role = serialize(["ROLE_SOMETHING_ELSE"]);查询进行过滤,ROLE_REP则会出现问题。同样真实的是,不同名称控制器的列表视图的 URI 与ROLE_REP.

目前还不清楚如何从这个洞中挖出来。虽然类似于此 SO answer,但它不适用于此处。也不清楚如何在 EasyCorp 的 github问题上应用相关评论。

编辑:如果QueryBuilder基于角色进行选择被放置在扩展的 CrudController(例如,RepresentativeCrudController extends RoleRepCrudController)中,那么代表的初始显示是正确的。使用菜单列出第二个角色提供了正确的列表。但是,使用菜单返回到上一个 crud 控制器使用相同的 uri,因此更改了列表,使得原来的代表选择消失了。

这是仪表板:

class DashboardController extends AbstractDashboardController
{

    /**
     * @Route("/admin", name="admin")
     */
    public function index(): Response
    {
        $routeBuilder = $this->get(CrudUrlGenerator::class)->build();
        return $this->redirect($routeBuilder->setController(RepresentativeCrudController::class)->generateUrl());
    }

    public function configureDashboard(): Dashboard
    {
        return Dashboard::new()
                        ->setTitle('');
    }

    public function configureMenuItems(): iterable
    {
        yield MenuItem::linkToCrud('Representative', 'fa fa-home', Person::class);
        yield MenuItem::linkToCrud('Volunteer', 'fa fa-home', Person::class);
        yield MenuItem::linktoRoute('Dashboard', 'fas fa-folder-open', 'dashboard');
        yield MenuItem::linktoRoute('Home', 'fas fa-folder-open', 'home_page');
    }
...
}

和一个 CrudController:

class RepresentativeCrudController extends AbstractCrudController
{

    public static function getEntityFqcn(): string
    {
        return Person::class;
    }

    public function configureCrud(Crud $crud): Crud
    {
        return $crud
                        ->setPageTitle(Crud::PAGE_INDEX, 'Representative')
                        ->setHelp('index', 'Replacing removes current staff.')
                        ->setSearchFields(['id', 'roles', 'email', 'fname', 'sname', 'confirmationToken', 'replacementStatus']);
    }

    public function configureActions(Actions $actions): Actions
    {
        return $actions
                        ->disable('new', 'edit', 'delete');
    }

    public function configureFields(string $pageName): iterable
    {
...
        }
    }

    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $role = serialize(["ROLE_REP"]);
        $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $qb->andWhere('entity.roles = :role');
        $qb->setParameter('role', $role);

        return $qb;
    }
...}

标签: phpsymfonyeasyadmin

解决方案


其实比较简单。querybuilder对于每个角色,使用基于角色的过滤器创建一个 crud 控制器。在仪表板中configureMenuItems(),显式添加控制器。例如:

        yield MenuItem::linkToCrud('Representative', 'fa fa-home', Person::class)
                        ->setController(RepresentativeCrudController::class);

现在 Person 实体按角色过滤。


推荐阅读