我的目标是创建一个表单,其中包含一个带有空选项的实体类型字段,并使用从ajax调用中检索的值创建。
我有一个名为IngredientType
的表单,代表Ingredient
实体。它与Recipe
实体具有“多对多”关系,从而生成一个名为IngredientInRecipe
的新实体。该实体还有一些额外的价值。 ingredientInRecipe
表单中的RecipeType
字段为CollectionType
。
ingredient
表单中的IngredientInRecipeType
字段如下所示:
$builder
->add('ingredient', EntityType::class, [
'choice_label' => 'name',
'choice_value' => 'uuid',
'class' => Ingredient::class,
'choices' => [],
'mapped' => false,
'by_reference' => false,
'attr' => [
'class' => 'ingredient-select'
]
])
请注意,由于ajax调用(数据保护)中未返回id
,因此我必须依赖实体的uuid
字段。此外,'choices'
为空。这样做是因为我们可以拥有数以千计的成分,每个食谱中有数十种成分,每个食谱有10个,20个或30个输入,每个输入都有超过数千个值,这只是愚蠢的。
现在这给了我错误:
Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[ingredientRecipe].children[0].children[ingredient] = e29b7bcc-aa20-415e-a383-c49cd6bdc01d
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
Unable to reverse value for property path "ingredient": The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique
Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique
所以,你可以看到我添加了'mapped'
和'by_reference'
的假值,希望这是原因,然后我可以在控制器中手动找到值,收到相同的错误,所以那不是问题。
我尝试添加DataTransformer
,以便uuid
转换为Ingredient
。这被触发并调用了函数,但看起来表单转换发生在事件链的早期。
然后我尝试弄乱表单本身,认为它不能转换,因为该选项不在选择数组中。这导致我进行了以下尝试。
$builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $formEvent) {
$formData = $formEvent->getData();
$uuid = $formData['ingredient'];
$form = $formEvent->getForm();
$form->remove('ingredient');
$ingredient = $this->manager->getRepository(Ingredient::class)->findOneBy(['uuid' => $uuid]);
$form->add('ingredient', EntityType::class, [
'choice_label' => 'name',
'class' => Ingredient::class,
'choices' => [$ingredient->getUuid() => $ingredient],
'mapped' => false,
'by_reference' => false,
'attr' => [
'class' => 'ingredient-select'
]
]);
});
不是很干净的代码,但功能就在那里。这也给了我同样的错误。我知道这个代码运行了,而且我知道我现在在选择中有正确的值,因为当我检查symfony分析器(这样一个很棒的工具顺便说一句)我可以看到这个
[
e29b7bcc-aa20-415e-a383-c49cd6bdc01d => Object(AppBundle\Entity\Ingredient)
]
但它仍然说
The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique
所以我在想,这是别的吗?有没有人可以帮忙解决这个问题?