是否可以为 $builder symfony 中使用 EventListener symfony 添加的字段分配值?

Posted

技术标签:

【中文标题】是否可以为 $builder symfony 中使用 EventListener symfony 添加的字段分配值?【英文标题】:is it possible to assign a value to a field added with EventListener symfony in $builder symfony? 【发布时间】:2021-08-29 17:45:43 【问题描述】:

我想知道是否可以自动为类型添加的字段赋值:

日期时间 实体

感谢您的帮助

public function buildForm(FormBuilderInterface $builder, array $options)


    $user = $options['user'];      // entity User
    $player = $options['player'];  // entity Player
    $today = new DateTime('now');  

    $builder

        ->add('fieldA')
        ->add('fieldB')
        ->add('fieldC');

    $builder

        ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($user, $player, $today) 

            $form = $event->getForm(); 
            $datas = $event->getData(); 

            $form->add('today');
            $form->add('user');
            $form->add('player');
            //dd($form);  ok = 3 fields added

            $datas['dateDuJour'] = $today;
            $datas['user'] = $user;
            $datas['player'] = $player;
            //dd($datas); ok = 3 assigned values

            $form->setData($datas); 
            question 1 :  how to insert the data in the form
            question 2 :  pb from entity (object) to string 
            //dd($form, $datas);



public function configureOptions(OptionsResolver $resolver)

    $resolver->setDefaults([
        'data_class'   => Evaluation::class,
        'user'         => null,
        'player'       => null
    ]);

我想过插入 type = hidden 的 3 个字段并使用 Data Transformer

我不知道最佳做法是什么?

如果你有一个具体的例子

【问题讨论】:

你能更准确地解释一下你的情况吗,我的意思是你想用数据做什么?为什么是“PRE_SUBMIT”? 【参考方案1】:

据我所知,您有一些表单,并且您想在提交时将 3 个数据插入表单。

根据您的数据库配置,您可以采用 3 种不同的方式:

最好的方法是使用映射

您的评估包含这 3 个字段:

日期 用户 播放器

然后将它们作为隐藏字段添加到原始构建器中,默认值是你所拥有的:

$builder->add('token', HiddenType::class, [
    'data' => $today,
])->add('user', HiddenType::class, [
    'data' => $user,
])->add('player', HiddenType::class, [
    'data' => $player,
]);

由于它们是隐藏的,因此安全检查不会自动让用户更改这些值,并且这些字段将被隐藏 它要求您的实体中存在这三个字段

第二个是使用未映射的隐藏字段。与以前相同,但添加 'mapped'` => false 。然后你在你的控制器中,你将拥有价值并根据需要使用它们。

第三个是不要在你的表单(我最喜欢的)中使用它们,而是在你的控制器中使用它们

    public function addEvaluation(Request $request, EvaluationManager $evaluationManager): Response
    
        $evaluation = new Evaluation();
        $form = $this->createForm(EvaluationType::class, $evaluation);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) 
            $evaluation->setTime(new DateTime('now'))
                       ->setUser($user)
                       ->setPlayer($player);
            $evaluationManager->save($evaluation);

            return $this->redirectToRoute('evaluation_add');
        
        return $this->render('/evaluation_add.twig', [
            'form' => $form,
        ]);
    

【讨论】:

感谢您非常清楚的解释。我选择了解决方案 3,但我不知道最佳做法是什么?我正在寻找探索 addEventlistener 但它似乎主要用于修改表单和添加值而不是例如实体。我不知道:“他的安全检查不会自动让用户更改这些值,而且这些字段将被隐藏它要求您的实体中存在这三个字段”谢谢 最佳实践是解决方案 3:formEventListener 在这里没有用处,您希望在客户端提供尽可能少的信息。因此,它更安全、更易于实施且最易于理解。

以上是关于是否可以为 $builder symfony 中使用 EventListener symfony 添加的字段分配值?的主要内容,如果未能解决你的问题,请参考以下文章

选中 Symfony 表单 EntityType 复选框

用 Mockery 模拟 Symfony 表单 'query_builder'

Symfony Query Builder join ON 和 WITH 区别

Symfony2 复合表单,将错误与字段关联

Symfony Query Builder 如何获取最后分组的记录

添加 CSS 到表单类型是 Symfony2