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

Mar*_*tis 3 symfony-forms symfony symfony-2.1

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

表单的视图数据应该是Acme\TaskBundle\Entity\Issue类的实例,但是是(n)字符串.您可以通过将"data_class"选项设置为null或通过添加将(n)字符串转换为Acme\TaskBundle\Entity\Issue实例的视图转换器来避免此错误.

问题是,我已经有一个变换器,它转换为TO字符串.

来自Form.php:

if (null !== $dataClass && !$viewData instanceof $dataClass) {
    throw new FormException(
       //...
    );
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*tis 6

经过一番挖掘后,我发现了我所面临的问题.

查看数据确实必须是data_class参数指定的类的实例.如果使用变换器对象 - >字符串,则必须将data_class参数设置为null.

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

默认情况下,data_classget_class指定初始数据的结果.如果将对象传递给控制器createForm或某些相应的form-creator函数,并且没有data_classexists的默认值,则将其设置为给定对象的类.

尽管如此,文档中给出的示例也可以正常工作 - 如果表单是内部的(在另一个表单中),data_class则不会被设置为如此null.

因为很少只从一个字段(我的变换器情况下的文本字段)制作表单,通常这个带变换器的表单将在其他形式内,所以它可以正常工作.