如何在 Symfony EasyAdmin 3 中创建数据验证系统

Posted

技术标签:

【中文标题】如何在 Symfony EasyAdmin 3 中创建数据验证系统【英文标题】:How to create a data validation system in Symfony EasyAdmin3 【发布时间】:2021-09-25 07:36:17 【问题描述】:

在上下文中,有一个编辑器可以根据他的 id 修改他的信息,并且他的信息必须由管理员验证在保存到数据库之前

我想创建一个临时表来存储编辑器将修改的信息,管理员可以通过 EasyAdmin 的界面访问他的信息,然后一旦管理员验证信息,它将保留在原始表中。

我在文档中没有找到恢复编辑页面表单信息的方法。

我加入了我想要定位的 crud 控制器:

类OperateurCrudController 扩展AbstractCrudController

private $crudUrlGenerator;
private $adminContextProvider;

public function __construct(AdminUrlGenerator $adminUrlGenerator, AdminContextProvider $adminContextProvider)

    $this->adminUrlGenerator = $adminUrlGenerator;
    $this->adminContextProvider = $adminContextProvider;



public static function getEntityFqcn(): string

    return Operateur::class;


public function configureFields(string $pageName): iterable

        return [
            IdField::new('id')->hideOnForm(),
            TextField::new('name', 'Nom'),
            TextEditorField::new('description', 'Description')->hideOnIndex(),
            TextareaField::new('address', 'Adresse'),
            TextField::new('city', 'Ville')->hideOnIndex(),
            TextField::new('postal_code', 'Code Postal')->hideOnIndex(),
            TextField::new('email', 'Email'),
            TelephoneField::new('phone', 'Téléphone'),
            UrlField::new('website', 'Site Web')->hideOnIndex(),
            TextEditorField::new('opening_hours', 'Horaires d\'Ouverture'),
            NumberField::new('latitude', 'Latitude')->hideOnIndex()->setNumDecimals(15),
            NumberField::new('longitude', 'Longitude')->hideOnIndex()->setNumDecimals(15),
            TextField::new('slug', 'Slug')->hideOnIndex()->setPermission('ROLE_ADMIN'),
            DateTimeField::new('created_at', 'Date Création')->onlyOnIndex(),
            DateTimeField::new('updated_at', 'Date Modification')->onlyOnIndex(),
            AssociationField::new('thematiques', 'Thématiques')

        ];



public function configureActions(Actions $actions): Actions

    $batchAction = Action::new('approve', 'Approuver', 'fa fa-user-check')
        ->linkToUrl('approveOperators');

    $updateOperator = Action::new('update', 'Enregistrer les modifications', 'fa fa-save')
        ->linkToCrudAction('saveOperator');


    if($this->isGranted('ROLE_ADMIN'))
        return $actions
            ->add(Crud::PAGE_INDEX, $batchAction)
            ->add(Crud:: PAGE_INDEX, Action::DETAIL)
            ->setPermission(Action::DELETE, 'ROLE_ADMIN')
            ->setPermission(Action::NEW, 'ROLE_ADMIN')
            ->setPermission(Action::EDIT, 'ROLE_ADMIN')
            ->setPermission($batchAction, 'ROLE_ADMIN');
    

    if($this->isGranted('ROLE_EDITOR'))
        return $actions
            ->add(Crud:: PAGE_INDEX, Action::DETAIL)
            ->add(Crud::PAGE_EDIT, $updateOperator)
            ->setPermission(Action::DELETE, 'ROLE_ADMIN')
            ->setPermission(Action::NEW, 'ROLE_ADMIN')
            ->setPermission($updateOperator, 'ROLE_EDITOR')
        ->disable( Action::SAVE_AND_RETURN, Action::SAVE_AND_CONTINUE);
    




public function approveOperators(): Response

    $this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification effecuté </span>');

    $url = $this->adminUrlGenerator
        ->setAction(Action::INDEX)
        ->generateUrl();


    return $this->redirect($url);






public function saveOperator()
    //$this->addFlash('notice', '<span style="color: green"><i class="fa fa-check"></i>Modification pris en compte ! </span>');

    //Create my own save button in page edit




public function configureCrud(Crud $crud): Crud

    return $crud
        ->setEntityPermission('ROLE_EDITOR');




public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder


    $response = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters);
    if(!$this->isGranted('ROLE_ADMIN'))
        $response->where('entity.id = :id');
        $response->setParameter('id', $this->getUser()->getOperateur());
    


    return $response;



public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void

    parent::updateEntity($entityManager, $entityInstance); // TODO: Change the autogenerated stub

感谢您的阅读

【问题讨论】:

一旦管理员按下“接受”按钮(或者您想设计接受机制),是什么阻止您复制数据?或者将“接受”字段设置为 true? 如果信息被接受,我也考虑过添加字段的解决方案,但我发现自己遇到了恢复表单值的同样问题。以及如何存储信息(例如,如果电脑同时崩溃) 创建两个实体。一个是你拥有的那个。另一个通过引用和接受字段与之相关。只有管​​理员可以编辑后面的实体。如果您的电脑崩溃,请使用可以处理崩溃的数据库。 好的,感谢您的解决方案!但是从表单中获取信息的方法是什么?或者一种覆盖保存和返回按钮的方法 好吧,也许它不是一个解决方案,我不知道。 EasyAdmin3 可能有办法允许/禁止基于记录的角色访问? (例如,一旦被接受,一个角色就不能再编辑记录)。 【参考方案1】:

你应该使用 BeforeEntityPersistedEvent::class

它将在将元素持久化到数据库中之前自动触发

class EasyAdminSubscriber extends AbstractController implements EventSubscriberInterface


  public function __construct( )
      

      

  public static function getSubscribedEvents()

    return [
      BeforeEntityPersistedEvent::class => ['functionName']
    ];
  

  public function functionName(BeforeEntityPersistedEvent $event)

    $entity=$event->getEntityInstance();

    $user = $this->getUser();
    $userRole = $user->getRole();
    $check = $this->checkRole($userRole);

    if ($entity instanceof yourEntity && $check== true) 

    
           //Do your magic with changing the value you want in the table you
       
    

抱歉没有评论,我没有足够的声誉,所以我在那里回答。

【讨论】:

请分享更多细节。这如何确保数据在被普通用户编辑后可以呈现给管理员? 他希望管理员对 prepersist 数据进行验证系统,因此用户尝试持久化数据,触发此事件,然后他可以选择自己的方式。发送这些信息,并在表格上为 null 的检查字段,发送警报“等待管理员验证,或向管理员发送链接,其中包含这些信息的预设表单。

以上是关于如何在 Symfony EasyAdmin 3 中创建数据验证系统的主要内容,如果未能解决你的问题,请参考以下文章

EasyAdmin 3.1 CrudControllers Symfony

Symfony 5 easyadmin 3 与 ManyToOne 关系的实体 - 不保存在“多”端

如何在easyadmin 3中更改分页

Symfony 4 EasyAdmin 如何加密密码?

Symfony 5 / Easyadmin 3 - FormBuilder 添加的字段未显示适当的输入

无法确定类“App\Entity\XXXX”中属性“image”的访问类型。 Symfony 4 - EasyAdmin 3.2 - VichUploader