【问题标题】:Symfony2 Form Entity to String Transformer IssueSymfony2 表单实体到字符串转换器问题
【发布时间】:2012-12-08 23:09:13
【问题描述】:

我正在使用 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 或添加视图时出错 将 a(n) 字符串转换为 Acme\TaskBundle\Entity\Issue。

问题是,我已经有一个转换器,可以转换 TO 字符串。

来自Form.php

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

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

【问题讨论】:

  • 您能告诉我们您的表单类型吗?帮助你会更容易!

标签: symfony symfony-2.1 symfony-forms


【解决方案1】:

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

查看数据确实必须是data_class参数指定的类的实例。如果使用transformer 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

由于只从一个字段(我的转换器案例中的文本字段)制作表单非常罕见,通常这种带有转换器的表单将在其他表单中,所以它会正常工作。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,因为我不小心输入了我的控制器:

    $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( ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2010-11-07
      • 1970-01-01
      • 2023-02-07
      • 2013-02-12
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多