是否可以为 $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 添加的字段分配值?的主要内容,如果未能解决你的问题,请参考以下文章
用 Mockery 模拟 Symfony 表单 'query_builder'
Symfony Query Builder join ON 和 WITH 区别