2013-10-30 45 views
3

我已經閱讀thisthis和其他的,但沒有人解決了我的問題。Symfony 2嵌入式表單:可捕獲的致命錯誤:傳遞給Entity :: addProperty的參數1必須是XX MyClass的實例,給出的數組爲

我已經刪除了所有可以縮小到一個字段的地址:地址。 當我嘗試按照this tutorial時,如果我遵循它,從一個新的新項目開始,一切正常。但是,當我在我的其他項目中手動執行該操作時,出現此錯誤: 「Catchable致命錯誤:傳遞給BN \ Bundle \ MyBundle \ Entity \ PersonTeacher :: addAdresse()的參數1必須是BN \ Bundle \ MyBundle \ Entity \ Adresse,在C:\ Users \ Olivier \ PhpstormProjects \ My \ My \ src \ BN \ Bundle \ MyBundle \ Entity \ PersonTeacher.php第111行中給出的數組。

繼承人的堆棧跟蹤: stacktracke

這裏是我的代碼,在那裏我已經刪除該工作性質:


我的控制器:

<?php 

namespace BN\Bundle\MyBundle\Controller; 

use BN\Bundle\MyBundle\Entity\PersonTeacher; 
use BN\Bundle\MyBundle\Entity\Adresse; 
use BN\Bundle\MyBundle\Form\Type\AdresseType; 
use Symfony\Component\DependencyInjection\ContainerAware; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class RegistrationController extends Controller 
{ 
    public function registerTeacherAction(Request $request) 
    { 
     $person = new PersonTeacher(); 
     $form = $this->createFormBuilder($person) 
      ->add('adresses', 'collection', 
       array(
        'type' => new AdresseType(), 
        'allow_add' => true, 
        'by_reference' => false, 
       ) 
      ) 
     ->getForm(); 
     $form->handleRequest($request); 
     if ($form->isValid()) { 
      /**/ 
     } 
     return $this->render('BNMyBundle:Registration:person_teacher.form.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
} 

我的實體PersonTeacher :

<?php 

namespace BN\Bundle\MyBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="person_teacher") 
* @ORM\Entity(repositoryClass="BN\Bundle\MyBundle\Repository\PersonTeacherRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class PersonTeacher extends Person 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /*--------- snap ---------*/ 

    /** 
    * @ORM\ManyToMany(
    *  targetEntity="Adresse", 
    *  inversedBy="personsTeacher", 
    *  cascade={"persist"} 
    *) 
    * @ORM\JoinTable(name="person_teacher_adresse") 
    **/ 
    private $adresses; 

    /*--------- snap ---------*/ 

    public function addAdresse(\BN\Bundle\MyBundle\Entity\Adresse $adresse) { 
     $this->adresses[] = $adresse; 
     return $this; 
    } 
    public function removeAdresse(\BN\Bundle\MyBundle\Entity\Adresse $adresse) { 
     $this->adresses->removeElement($adresse); 
    } 
    public function getAdresses() { 
     return $this->adresses; 
    } 
    /*--------- snap ---------*/ 
    public function __construct() { 
     parent::__construct(); 
     $this->adresses = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
} 

提示

注:我已經簽了形式正確發送,這些信息的格式正確,我也一步一步地與Xdebug的步調試,但它太複雜對我來說(但)看到我缺少的東西。

這是一個'collection'類型的問題:如果我刪除'by_reference' => false,那麼它的工作....只有當我不堅持它。

如果我嘗試使用此代碼堅持它:

$form->handleRequest($request); 
    if ($form->isValid()) { 
     $person=$form->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($person); 
     $em->flush(); 
    } 

然後我得到這個錯誤:

警告:spl_object_hash()預計參數1是對象,在給定的數組(projectpath)\ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ UnitOfWork.php line 1572

爲什麼?

+0

如果你把'ManyToMany'改成'OneToMany'作爲測試怎麼辦? – cheesemacfly

+0

我試圖改變另一個'ManyToMany'關係:課程(一位教師可能會給一個或多個課程,一個或多個教師可能會給一個課程)。有用。所以唯一的解釋是有一些字段或一個聲明丟失,但我真的不知道可能會丟失什麼。 –

回答

9

我找到了。

問題出在我的FormTypeAddressType.php文件:功能setDefaultOptions()丟失。一切都很好,但是如果你想讓學說能夠把傳入的字段轉換成一個特定的類,這個函數必須是強制性的

public function setDefaultOptions(
    \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver 
) { 
    $resolver->setDefaults(array(
     'data_class' => 'MyBundle\Entity\Adresse', 
    )); 
} 

我很生氣,因爲我失去了那個時間。你必須知道整個Symfony 2流程能夠快速解決這些問題,或者需要6個小時才能解決這些問題。 Symfony 2本身就是一個整體leaky abstraction:你感覺像獲得時間,但你沒有。Symfony應該簡化你的生活,但最後引用JoëlSpolsky:

It's a leaky abstraction: it means that abstractions do not really simplify our lives as much as they were meant to. Code generation tools which pretend to abstract out something, like all abstractions, leak, and the only way to deal with the leaks competently is to learn about how the abstractions work and what they are abstracting.

+0

你救了我一天 – Nico

+0

我救了你,但是失去了一個**':^ /'** –

相關問題