【问题标题】:is it possible to assign a value to a field added with EventListener symfony in $builder symfony?是否可以为 $builder symfony 中使用 EventListener 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”?

标签: php forms symfony addeventlistener


【解决方案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 在这里没有用处,您希望在客户端提供尽可能少的信息。因此,它更安全、更易于实施且最易于理解。
猜你喜欢
  • 2017-06-09
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多