2012-12-08 84 views
3

我正在使用Symfony 2.1.3-DEV并尝试实现转换实体到字符串(某种ID),然后在表单提交时从字符串返回到实体。如果我使用的食谱给变压器的问题是一样的: http://symfony.com/doc/master/cookbook/form/data_transformers.htmlSymfony2表单实体到字符串转换器问题

控制器代码:

$task = $entityManager->find('AcmeTaskBundle:Task', $id); 
$form = $this->createForm(new TaskType(), $task); // so $task->issue is Issue object 

我得到这个错误:

The form's view data is expected to be an instance of class Acme\TaskBundle\Entity\Issue, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Acme\TaskBundle\Entity\Issue.

的事情是,我已经有一个变换器,它转换为字符串。

Form.php

if (null !== $dataClass && !$viewData instanceof $dataClass) { 
    throw new FormException(
     //... 
    ); 
} 

为什么$viewData被检查为data_class参数(或者猜到类型给定对象的)的实例?不是视图数据应该是字符串/数组等?我错过了什么吗?

+1

您能向我们展示您的表单类型吗?帮助你会更容易! – Snroki

回答

6

经过一些挖掘一步一步,我发现我面临的问题。

查看数据确实必须是由data_class参数指定的类的实例。如果使用的是变换器Object - > string,则必须将data_class参数设置为null

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => null, 
    )); 
} 

缺省情况下,data_class是指定的初始数据的get_class结果。如果您将对象传递给控制器​​的createForm或某个相应的表单创建器函数,并且不存在缺省值data_class,则它将设置为给定对象的类。

尽管如此,文档中给出的示例工作正常 - 如果表单是内部的(在另一个表单中),将不会设置data_class,因此它将是null

由于仅从一个字段(我的变压器外壳中的文本字段)形成表单非常罕见,通常这种带有变压器的表单将在其他表单中,所以它可以正常工作。如果你不使用任何自定义数据变压器检查

$em->getRepository('AcmeWhateverBundle:Something')->findOneBy(array('id' => $id), array());

所以:

0

我有同样的问题,因为我不小心在我的控制器类型:的

$em->getRepository('AcmeWhateverBundle:Something')->findBy(array('id' => $id), array());

代替下一行中的$实体是与FormType中的data_class定义的同一类的对象:

示波器控制器: $form = $this->createForm(new SomethingType(), $entity, array(....