Php 自己处理表单数据

Php 自己处理表单数据,php,symfony,Php,Symfony,我用createFormBuilder构建了一个表单 $form = $this->createFormBuilder($post) ->add("name", TextType::class, array("label"=>"Article Title")) ->add("content", TextareaType::class, array("label"=>"Article Content")) ->ad

我用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();
附件变量是一个实体变量,我想从表单中获取一个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();
但是,有一个错误提示说:

无法确定类中属性附件的访问类型 App\Entity\Post

我不知道如何解决这个问题,如果我在实体中添加@ORM\Columntype=string,json字符串也会被存储,我认为这不是一个好的解决方案


如何修改代码?

首先,为了消除错误,您需要将mapped=>false添加到附件字段的字段选项中

如果附件字段配置为映射字段,则表单组件将在Post实体中查找setAttachments方法或公共属性attachments,以设置该值,而该值在Post实体中不存在。这就是您收到错误消息的原因:

无法确定类App\Entity\Post中属性附件的访问类型

为了自己将提交的JSON字符串转换为附件实体,您需要一个自定义数据转换器

有关如何创建和使用数据转换器的示例,请参见文档章节

一个干净的解决方案包括attachments字段是EntityType的CollectionType,将整个表单作为JSON POST请求发送,并使用FOSRestBundle的fos_rest.decoder.JSONForm主体侦听器将JSON请求解码为表单


可以找到FOSRestBundle的body侦听器支持的文档

很长一段时间,但是$attachments实际上是用附件填充的吗?您确定它不是空的/未定义的吗?此外,如果表单上没有enctype=multipart/form数据,附件通常不起作用。您可以向我们展示您的Post实体吗?