我用createFormBuilder构建了一个表单
$form = $this->createFormBuilder($post)
->add("name", TextType::class, array("label"=>"Article Title"))
->add("content", TextareaType::class, array("label"=>"Article Content"))
->add("categories",
EntityType::class,
array(
"class" => Category::class,
"choice_label" => "name",
"multiple" => true,
"label" => "Article Category",
"required" => false
)
)
->add("attachments", TextType::class, array("required"=>false))
->add("submit", SubmitType::class, array("label"=>"Add new article"))
->getForm();
“attachments”变量是一个实体变量,我想从表单中获取一个json字符串并自己搜索数据库,如下所示:
$em = $this->getDoctrine()->getManager();
$attachmentsRepository = $em->getRepository(Attachment::class);
$attachments = $post->getAttachments();
$json = json_decode($attachments);
$dataSize = sizeof($json);
for ($i = 0; $i < $dataSize; $i ++) {
$attachment = $attachmentsRepository->find($json[$i]->getId());
$post->addAttachments($attachment);
}
$em->persist($post);
$em->flush();
然而,有错误提示说:
无法确定类中属性“附件”的访问类型 “应用\实体\邮报”。
我不知道如何解决这个问题,如果我在我的实体中添加@ORM \ Column(type =“string”),json字符串也将被存储,我认为这不是一个好的解决方案。 / p>
如何修改我的代码?
答案 0 :(得分:1)
首先,要解决将mapped => false
添加到attachments
字段的字段选项所需的错误。
如果将attachments
字段配置为映射字段,则表单组件将在{{{{{}}中查找setAttachments()
方法或公共属性attachments
1}}设置值的实体 - 在Post
实体中不存在。这就是您收到错误消息的原因:
无法确定“App \ Entity \ Post”类中属性“附件”的访问类型。
为了将提交的JSON字符串转换为Post
个实体,您需要自定义数据转换器!
创建和使用数据转换器的一个很好的例子可以在文档章节How to Use Data Transformers中找到。
干净的解决方案会使Attachment
字段成为attachments
CollectionType
,将整个表单作为JSON POST请求发送并使用ie EntityType
的{{1} 1}} body侦听器将JSON请求解码为表单。
可以找到FOSRestBundle的身体监听器支持文档here。