2012-08-06 99 views
1

試圖更新實體時,我發現了以下異常多對一的關係:奇怪的例外設立時的Symfony 2和學說

The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class Proxies__CG__\Acme\DemoBundle\Entity\TicketCategory. You can avoid this error by setting the "data_class" option to "Proxies__CG__\Acme\DemoBundle\Entity\TicketCategory" or by adding a view transformer that transforms an instance of class Proxies__CG__\Acme\DemoBundle\Entity\TicketCategory to scalar, array or an instance of \ArrayAccess. 

創建時,不會出現問題和關係確定。但是,更新時會出現這種奇怪的異常。我的實體是設置這樣的:

class Ticket 
{ 
    // ... 

    /** 
    * @var TicketCategory 
    * 
    * @ORM\ManyToOne(targetEntity="TicketCategory") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    protected $category; 

    // ... 
} 

class TicketCategory 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $title 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    private $title; 

    // ... 
} 

形式

class TicketType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title', 'text', array(
        'error_bubbling' => true, 
       ) 
      ) 
      ->add('category', 'text', array(
        'error_bubbling' => true, 
       ) 
      ) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Acme\DemoBundle\Entity\Ticket', 
      'csrf_protection' => false, 
     )); 
    } 

    public function getName() 
    { 
     return ''; 
    } 
} 

任何想法,夥計們?

+0

郵政表格也是如此。 – gremo 2012-08-06 20:52:34

+0

完成,發佈它。 – vinnylinux 2012-08-06 20:56:22

回答

4

問題是:

$builder 
     ->add('category', 'text', array(
       'error_bubbling' => true, 
      ) 
     ) 
    ; 

category聲明類型 「文本」 的,因此,你可以只傳遞標量(字符串,布爾等),以它。那就是你只能指定標量屬性(Ticket類)。

Ticketcategory它是一個實體,所以發生錯誤。

不知道你想完成什麼,我想你想使用戶選擇的票類,所以我會做:

$builder 
     ->add('category', 'entity', array(
       'label' => 'Assign a category', 
       'class' => 'Acme\HelloBundle\Entity\TicketCategory', 
       'property' => 'title', 
       'multiple' => false 
      ) 
     ) 
    ; 

更多entity field type

編輯:不知道你是否省略了它,但是Ticket沒有名爲「title」的屬性。

+0

它必須是文本,這不是一個常見的形式。這是一個REST風格的web服務。我使用$ em-> getRepository('ApiTicketBundle:TicketCategory') - > find($ request-> request-> get('category))將文本字段值從字符串(這是類別ID)轉換爲對象。 ); 這與問題無關,因爲它完美地創建了實體,並且也建立了關係。它只是未能更新。 – vinnylinux 2012-08-06 21:30:54

+0

@vinnylinux所以,你使用的是http://symfony.com/doc/current/cookbook/form/data_transformers.html?無論如何,你必須在你的問題中更具體......用你發佈的代碼,錯誤是字段本身(如果你不使用變壓器)。 – gremo 2012-08-06 21:36:14