php - EasyAdmin 3:用户角色过滤器显示以前过滤器的数据
问题描述
使用 EasyAdmin 3.xa 可以构建过滤器以按用户角色选择用户实体的列表视图。例如,如果角色是ROLE_REP
,则使用实体的代表App\Entity\Person
CrudController 可能包含以下内容:
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;
}
...}
解决方案
其实比较简单。querybuilder
对于每个角色,使用基于角色的过滤器创建一个 crud 控制器。在仪表板中configureMenuItems()
,显式添加控制器。例如:
yield MenuItem::linkToCrud('Representative', 'fa fa-home', Person::class)
->setController(RepresentativeCrudController::class);
现在 Person 实体按角色过滤。
推荐阅读
- javascript - 如何模拟酶组件中的组件
- c# - Visual Studio 在 RDLC 报告中错误地显示条码字体
- libreoffice-writer - 标尺栏中的这个符号是什么?
- python - 找不到标签或无法拉取内容时如何重新加载页面?
- python - 根据计算向数据框添加多列的函数 - Pandas
- python - 使用 input() 作为默认参数的函数——收集输入但不打印输出
- reactjs - 来自数据获取的 TypeScript 接口对象
- java - 如何在 Android 中添加自定义导航视图
- c - 编译 Glibc 时出现“未定义对 `__dso_handle' 的引用”的错误
- javascript - Angular pwa 应用程序(离线)工作正常,但 Web(笔记本电脑)所做的任何更改在移动视图(浏览器)上都不可见,反之亦然