EasyAdmin按用户角色限制订单状态可见性及VichBundle图片显示问题咨询
Symfony EasyAdminBundle 问题解决方案
1. 按用户角色控制订单状态可见范围
实现逻辑通过重写EasyAdmin的索引查询构造器,根据当前用户角色动态添加查询过滤条件,步骤如下:
- 先在Crud控制器中注入Security服务,用于获取当前用户角色
- 重写
createIndexQueryBuilder方法,加入角色对应的状态过滤规则 - 注意修正你代码中的拼写错误:角色
USERS_PRODUT、状态cenceled请和你实际定义的枚举值保持一致
示例代码:
// 先引入需要的类 use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository; use Symfony\Bundle\SecurityBundle\Security; use Doctrine\ORM\QueryBuilder; class PurchasedorderCrudController extends AbstractCrudController { public function __construct( private Security $security ) {} // 原有代码保留,新增以下方法 public function createIndexQueryBuilder(EntityRepository $entityRepository, string $entityFqcn, string $sortDirection, ?string $sortField = null, ?string $dqlFilter = null): QueryBuilder { $qb = parent::createIndexQueryBuilder($entityRepository, $entityFqcn, $sortDirection, $sortField, $dqlFilter); // 关联订单表,根据你的实际关联属性名调整,这里假设Purchasedorder关联Orders的属性名为orders $qb->leftJoin('entity.orders', 'o') ->addSelect('o'); // 按角色过滤 if ($this->security->isGranted('USER_ADMIN')) { $qb->andWhere('o.status IN (:adminStatus)') ->setParameter('adminStatus', ['pending', 'cancelled']); } elseif ($this->security->isGranted('USERS_PRODUCT')) { $qb->andWhere('o.status = :productStatus') ->setParameter('productStatus', 'received'); } return $qb; } // 原有其他方法 }
2. 已上传Vich图片无法预览
你没有在字段配置中添加图片预览的展示字段,按以下步骤调整:
- 先确认你的实体(假设是关联的Items实体,或者Purchasedorder本身)已经正确配置了VichUpload的注解:包含
$xxxFile(上传用临时属性)、$xxxName(存文件名的持久化属性) - 在
configureFields方法中分别配置表单上传字段和预览字段 - 确认你Vich配置中对应资源的
uri_prefix和下面setBasePath的参数一致,同时检查public目录下的上传文件夹有可读权限,执行过php bin/console assets:install或php bin/console uploads:link(如果配置了软链接)
示例代码:
// 引入ImageField类 use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField; public function configureFields(string $pageName): iterable { return [ DateField::new('purchaseddate'), AssociationField::new('items'), // 新增图片相关字段,根据你实际的属性名调整 // 表单页用的上传字段 ImageField::new('certificateFile') // 对应实体里Vich标记的file属性 ->setFormType(VichFileType::class) ->onlyOnForms(), // 列表/详情页用的预览字段 ImageField::new('certificateName') // 对应实体里存文件名的属性 ->setBasePath('/uploads/purchased_cert') // 和你Vich配置的uri_prefix一致 ->hideOnForm(), ]; }
额外注意
你现有代码的configureActions方法存在逻辑错误,第一个return $actions之后的代码完全不会执行,需要合并逻辑修改为:
public function configureActions(Actions $actions): Actions { $viewInvoice = Action::new('viewInvoice', 'Invoice', 'fa fa-file-invoice') ->linkToCrudAction('renderInvoice'); return $actions ->add(Crud::PAGE_INDEX, Action::DETAIL) ->add(Crud::PAGE_DETAIL, $viewInvoice); }
内容的提问来源于stack exchange,提问作者Anim Damson
相关产品推荐
相关产品推荐

