Mysql Symfony2:嵌入具有多对多实体的表单引发异常 问题
我一直在尝试按照教程将表单嵌入到另一个表单中。我在这里要做的是添加一个任务,并向其中添加多个类别。我正在使用的示例是,但我添加了一些ORM注释以使关系成为多对多。因此,以下是我的任务和类别实体代码: 代码 任务实体 现在,当我转到任务的“创建”页面时,出现以下错误: 表单的视图数据应该是类的实例 Acme\TaskBundle\Entity\Category,但是类的实例 条令\公共\集合\阵列集合。您可以避免此错误 通过将“data_class”选项设置为null或添加视图 转换类实例的转换器 条令\Common\Collections\ArrayCollection到的实例 Acme\TaskBundle\Entity\CategoryMysql Symfony2:嵌入具有多对多实体的表单引发异常 问题,mysql,forms,symfony,doctrine-orm,Mysql,Forms,Symfony,Doctrine Orm,我一直在尝试按照教程将表单嵌入到另一个表单中。我在这里要做的是添加一个任务,并向其中添加多个类别。我正在使用的示例是,但我添加了一些ORM注释以使关系成为多对多。因此,以下是我的任务和类别实体代码: 代码 任务实体 现在,当我转到任务的“创建”页面时,出现以下错误: 表单的视图数据应该是类的实例 Acme\TaskBundle\Entity\Category,但是类的实例 条令\公共\集合\阵列集合。您可以避免此错误 通过将“data_class”选项设置为null或添加视图 转换类实例的转换器
老实说,我不知道如何修复它,因为这似乎是一个非常直截了当的事情,但显然不是。有人能帮我一下吗?在您的
任务实体中
删除类别验证。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.