Mysql Symfony2:嵌入具有多对多实体的表单引发异常 问题

Mysql Symfony2:嵌入具有多对多实体的表单引发异常 问题,mysql,forms,symfony,doctrine-orm,Mysql,Forms,Symfony,Doctrine Orm,我一直在尝试按照教程将表单嵌入到另一个表单中。我在这里要做的是添加一个任务,并向其中添加多个类别。我正在使用的示例是,但我添加了一些ORM注释以使关系成为多对多。因此,以下是我的任务和类别实体代码: 代码 任务实体 现在,当我转到任务的“创建”页面时,出现以下错误: 表单的视图数据应该是类的实例 Acme\TaskBundle\Entity\Category,但是类的实例 条令\公共\集合\阵列集合。您可以避免此错误 通过将“data_class”选项设置为null或添加视图 转换类实例的转换器

我一直在尝试按照教程将表单嵌入到另一个表单中。我在这里要做的是添加一个任务,并向其中添加多个类别。我正在使用的示例是,但我添加了一些ORM注释以使关系成为多对多。因此,以下是我的任务和类别实体代码:

代码 任务实体 现在,当我转到任务的“创建”页面时,出现以下错误:

表单的视图数据应该是类的实例 Acme\TaskBundle\Entity\Category,但是类的实例 条令\公共\集合\阵列集合。您可以避免此错误 通过将“data_class”选项设置为null或添加视图 转换类实例的转换器 条令\Common\Collections\ArrayCollection到的实例 Acme\TaskBundle\Entity\Category


老实说,我不知道如何修复它,因为这似乎是一个非常直截了当的事情,但显然不是。有人能帮我一下吗?

在您的
任务实体中
删除类别验证。
Symfony尝试将ArrayCollection验证为一个类别!(因此出现了错误)

这不是必需的,因为它是一个集合。(验证将基于集合中的对象类型)
如果您创建了CategoryType表单,那么该表单应该为其数据类返回
Acme\TaskBundle\Entity\Category

class CategoryType {
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TaskBundle\Entity\Category',
        .....
        ));
    }
}
另外,在TaskType中

$builder
    ->add('name')
    ->add('categories', new CategoryType()) // new CategoryType()
                                            // is not really needed here,
                                            // symfony will automatically detect
                                            // it's relation and create a new 
                                            // CategoryType if necessary.

谢谢,这消除了错误,但是这段代码没有实现我期望的功能。实际上,我希望用户在添加任务时能够以相同的形式添加类别。所以,具体的例子是:我想添加一个任务“FinishWebDesign”。我没有“Webdesign”和“Photoshop”这两个类别,但我想在这个表单中添加它们,而不留下它。这可能吗?找到了一个我之前谈论的例子:(用户名:admin&密码:admin)。创建用户时,还可以选择以相同的形式创建新用户组。这是我想要复制的功能。这是用ajax完成的!不在用户表单内部,添加group->ajax调用(get)->returns group form->create->ajax调用(post)->成功创建组时返回组\u id->如果是,将组(带有value=“group\u id”的复选框)附加到当前用户表单。但这并不是你最初的问题!
<?php

namespace Acme\TaskBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('categories', new CategoryType())
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TaskBundle\Entity\Task',
            'cascade_validation' => true,
        ));
    }

    public function getName()
    {
        return 'task';
    }
}
* @Assert\Type(type="Acme\TaskBundle\Entity\Category")
*/
$categories;
class CategoryType {
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TaskBundle\Entity\Category',
        .....
        ));
    }
}
$builder
    ->add('name')
    ->add('categories', new CategoryType()) // new CategoryType()
                                            // is not really needed here,
                                            // symfony will automatically detect
                                            // it's relation and create a new 
                                            // CategoryType if necessary.