Symfony2表单实体到字符串变换器问题

时间:2012-12-08 23:09:14

标签: symfony symfony-2.1 symfony-forms

我正在使用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参数的实例(或给定对象的猜测类型)?是不是视图数据应该是字符串/数组等?我错过了什么吗?

2 个答案:

答案 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( ....