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

is it possible to assign a value to a field added with EventListener symfony in $builder symfony?

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

感谢您的帮助

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
    ]);
}

}

我考虑过插入类型为隐藏的 3 个字段并使用 Data Transformer

不知最佳做法是什么?

如果你有一个具体的例子

据我所知,您有一些表单,并且您希望在提交时将 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,
        ]);
    }