自己处理表单数据

时间:2018-02-04 14:15:48

标签: php symfony

我用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>

如何修改我的代码?

1 个答案:

答案 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