我刚刚开始在PHP Symfony与现有的项目。该项目已部署,并且可以正常工作,但在不同的本地环境中,某些端点会出现一些奇怪的情况,这些端点涉及外键列表(多对多),我无法弄清楚。所以我有一个实体人谁可以拥有多个房子(多对多),并有一个主要的房子。创建person时,作为外键的house与person一起传递,如下所示:
{
"name": "John Doe",
"mainHouse": 62,
"houses": [62]
}
在更正后的版本中,JSON对象由三个键值对组成:“name”具有值“John Doe”,“mainHouse”具有值62,“houses”具有包含数字62的数组。
在个人实体中,一切似乎都定义得很好:
class Person
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity=House::class, inversedBy="owners")
* @ORM\JoinTable(name="person_house")
*/
private $houses;
/**
* @ORM\ManyToOne(targetEntity=House::class)
*/
private $mainHouse;
.
.
.
}
以及表单定义的类型类:
class PersonType extends AbstractType
{
.
.
->add('houses', EntityType::class, [
'required' => true,
'multiple' => true,
'class' => House::class
])
->add('mainHouse', EntityType::class, [
'required' => true,
'class' => House::class
])
.
.
}
创建Person的控制器如下所示:
public function createPerson(Request $request)
{
$em = $this->getDoctrine()->getManager();
$person = new Person();
$content = json_decode($request->getContent(), true);
$form = $this->createForm(PersonType::class, $person);
$form->submit($content);
if ($form->isValid()) {
$em->persist($person);
$em->flush();
return $person;
}
return $form;
我的问题是每次我传递一个房子列表的外键,即使它们存在于数据库中,我在$form->isValid()行上得到一个错误的请求(Validation failed),其中“this value is not valid”用于属性houses,而不是mainHouse。对于所有其他类型list的属性,都是这样的,它们接受一个外键列表。总的来说,我还没有弄清楚symfony是如何在请求体中找到这些外键并将它们转换为实体的,以及为什么简单的值不适用于列表。我搜索了ParamConverters和DataTransformers,但在我的项目中没有看到任何与之相关的东西。我需要做些什么来激活此功能吗?
1条答案
按热度按时间gtlvzcf81#
我通过降级PHP版本解决了这个问题。我有PHP v8.2.5,降级到PHP v8.0.29。我没有看到 composer 安装软件包不兼容的错误信息,只是运行 composer 安装,直到我使用PhpStorm提示 composer 安装,这表明一些软件包与我的PHP版本不兼容,因此降级。