2012-12-08 25 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(....