我正在使用Symfony 2.1.3-DEV并尝试将实体转换为字符串(某种ID),然后在提交表单时从字符串返回实体。如果我使用食谱中给出的变压器,问题是一样的: http://symfony.com/doc/master/cookbook/form/data_transformers.html
控制器代码:
$task = $entityManager->find('AcmeTaskBundle:Task', $id);
$form = $this->createForm(new TaskType(), $task); // so $task->issue is Issue object
我收到此错误:
表单的视图数据应该是类的实例 Acme \ TaskBundle \ Entity \ Issue,但是是(n)字符串。你可以避免这种情况 将“data_class”选项设置为null或添加视图时出错 将(n)字符串转换为实例的变换器 极致\ TaskBundle \实体\问题。
问题是,我已经有一个变换器,它转换为TO string。
来自Form.php
:
if (null !== $dataClass && !$viewData instanceof $dataClass) {
throw new FormException(
//...
);
}
为什么$viewData
被检查为data_class
参数的实例(或给定对象的猜测类型)?是不是视图数据应该是字符串/数组等?我错过了什么吗?
答案 0 :(得分:6)
经过一番挖掘后,我发现了我面临的问题。
查看数据确实必须是data_class
参数指定的类的实例。如果您正在使用变换器对象 - >字符串,您必须将data_class
参数设置为null
。
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => null,
));
}
默认情况下,data_class
是指定初始数据的get_class
的结果。如果将对象传递给控制器的createForm
或某个相应的form-creator函数,并且data_class
没有默认值,则将其设置为给定对象的类。
尽管如此,文档中给出的示例工作正常 - 如果表单是内部的(在另一个表单中),data_class
将不会被设置为null
。
由于很少只从一个字段(我的变换器案例中的文本字段)制作表单,通常这个带变换器的表单将在其他表单中,因此它可以正常工作。
答案 1 :(得分:0)
我遇到了同样的问题,因为我不小心输入了我的控制器:
$em->getRepository('AcmeWhateverBundle:Something')->findBy(array('id' => $id), array());
而不是:
$em->getRepository('AcmeWhateverBundle:Something')->findOneBy(array('id' => $id), array());
因此,如果您不使用任何自定义数据转换器,请检查以下行中的$ entity是否是FormType中定义为data_class的同一个类的对象:
范围控制器:
$form = $this->createForm(new SomethingType(), $entity, array( ....