2015-09-25 222 views
1

我有一個文件/src/AppBundle/Entity/Questionnaire.php帶有3個實體類,我試圖在Symfony上實現與Doctrine 2的單表繼承2.7。 問卷是一個父抽象類,並有2個類FirstQuestionsSecondsQuestions延伸問卷。我選擇了這個模型,因爲我需要用2個步驟在表格中寫入數據。此文件的代碼如下:在Symfony 2中創建子實體類的對象時出錯

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Questionnaire 
* 
* @ORM\Entity 
* @ORM\Table(name="questionnaire") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"firstquestions" = "FirstQuestions", "secondquestions" = "SecondQuestions"}) 
*/ 
abstract class Questionnaire { 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

/** 
* FirstQuestions 
*/ 
class FirstQuestions extends Questionnaire { 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="firstName", type="string", length=64) 
    */ 
    private $firstName; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="lastName", type="string", length=64) 
    */ 
    private $lastName; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=32) 
    */ 
    private $email; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="birthday", type="date") 
    */ 
    private $birthday; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="shoeSize", type="integer") 
    */ 
    private $shoeSize; 

    /** 
    * Set firstName 
    * 
    * @param string $firstName 
    * 
    * @return Questionnaire 
    */ 
    public function setFirstName($firstName) 
    { 
     $this->firstName = $firstName; 

     return $this; 
    } 

    /** 
    * Get firstName 
    * 
    * @return string 
    */ 
    public function getFirstName() 
    { 
     return $this->firstName; 
    } 

    /** 
    * Set lastName 
    * 
    * @param string $lastName 
    * 
    * @return Questionnaire 
    */ 
    public function setLastName($lastName) 
    { 
     $this->lastName = $lastName; 

     return $this; 
    } 

    /** 
    * Get lastName 
    * 
    * @return string 
    */ 
    public function getLastName() 
    { 
     return $this->lastName; 
    } 

    /** 
    * Set email 
    * 
    * @param string $email 
    * 
    * @return Questionnaire 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    /** 
    * Get email 
    * 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * Set birthday 
    * 
    * @param \DateTime $birthday 
    * 
    * @return Questionnaire 
    */ 
    public function setBirthday($birthday) 
    { 
     $this->birthday = $birthday; 

     return $this; 
    } 

    /** 
    * Get birthday 
    * 
    * @return \DateTime 
    */ 
    public function getBirthday() 
    { 
     return $this->birthday; 
    } 

    /** 
    * Set shoeSize 
    * 
    * @param integer $shoeSize 
    * 
    * @return Questionnaire 
    */ 
    public function setShoeSize($shoeSize) 
    { 
     $this->shoeSize = $shoeSize; 

     return $this; 
    } 

    /** 
    * Get shoeSize 
    * 
    * @return integer 
    */ 
    public function getShoeSize() 
    { 
     return $this->shoeSize; 
    } 
} 

/** 
* SecondQuestions 
*/ 
class SecondQuestions extends Questionnaire { 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteIceCream", type="string", length=128) 
    */ 
    private $favoriteIceCream; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteSuperHero", type="string", length=32) 
    */ 
    private $favoriteSuperHero; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteMovieStar", type="string", length=64) 
    */ 
    private $favoriteMovieStar; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="endOfTheWorld", type="date") 
    */ 
    private $endOfTheWorld; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="superBowlWinner", type="string", length=32) 
    */ 
    private $superBowlWinner; 

    /** 
    * Set favoriteIceCream 
    * 
    * @param string $favoriteIceCream 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteIceCream($favoriteIceCream) 
    { 
     $this->favoriteIceCream = $favoriteIceCream; 

     return $this; 
    } 

    /** 
    * Get favoriteIceCream 
    * 
    * @return string 
    */ 
    public function getFavoriteIceCream() 
    { 
     return $this->favoriteIceCream; 
    } 

    /** 
    * Set favoriteSuperHero 
    * 
    * @param string $favoriteSuperHero 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteSuperHero($favoriteSuperHero) 
    { 
     $this->favoriteSuperHero = $favoriteSuperHero; 

     return $this; 
    } 

    /** 
    * Get favoriteSuperHero 
    * 
    * @return string 
    */ 
    public function getFavoriteSuperHero() 
    { 
     return $this->favoriteSuperHero; 
    } 

    /** 
    * Set favoriteMovieStar 
    * 
    * @param string $favoriteMovieStar 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteMovieStar($favoriteMovieStar) 
    { 
     $this->favoriteMovieStar = $favoriteMovieStar; 

     return $this; 
    } 

    /** 
    * Get favoriteMovieStar 
    * 
    * @return string 
    */ 
    public function getFavoriteMovieStar() 
    { 
     return $this->favoriteMovieStar; 
    } 

    /** 
    * Set endOfTheWorld 
    * 
    * @param \DateTime $endOfTheWorld 
    * 
    * @return Questionnaire 
    */ 
    public function setEndOfTheWorld($endOfTheWorld) 
    { 
     $this->endOfTheWorld = $endOfTheWorld; 

     return $this; 
    } 

    /** 
    * Get endOfTheWorld 
    * 
    * @return \DateTime 
    */ 
    public function getEndOfTheWorld() 
    { 
     return $this->endOfTheWorld; 
    } 

    /** 
    * Set superBowlWinner 
    * 
    * @param string $superBowlWinner 
    * 
    * @return Questionnaire 
    */ 
    public function setSuperBowlWinner($superBowlWinner) 
    { 
     $this->superBowlWinner = $superBowlWinner; 

     return $this; 
    } 

    /** 
    * Get superBowlWinner 
    * 
    * @return string 
    */ 
    public function getSuperBowlWinner() 
    { 
     return $this->superBowlWinner; 
    } 
} 

所以,問題是,當我試圖創建子類的對象(FirstQuestionsSecondsQuestions)的控制器,Symfony的顯示器的方法我錯誤「500內部服務器錯誤」。控制器的代碼與方法如下:

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Request; 
use AppBundle\Entity\Questionnaire; 
use AppBundle\Entity\FirstQuestions; 
use AppBundle\Entity\SecondQuestions; 

class TestController extends Controller 
{ 

    /** 
    * @Route("/test", name="test") 
    */ 
    public function indexAction(Request $request) 
    { 
     $item = new FirstQuestions(); // everything works well without this line 
     return new Response(
      'ok' 
     ); 
    } 
} 

也許我做錯了什麼或沒有設置任何重要的註釋。誰能幫我?

回答

2

這將是那些惱人的小監督錯誤之一 - 一個額外的分號或某個地方,你不是在找它。我正在創建這個額外的答案,以便我可以完全給你我使用的代碼。希望你能夠剪切和粘貼,用這個新代碼替換你自己的文件,它會神奇地開始工作。

第一 - 爲了證明這一點,這是我(修改)輸出:

Veromo\Bundle\CoreBundle\Entity\FirstQuestions Object 
(
    [firstName:Veromo\Bundle\CoreBundle\Entity\FirstQuestions:private] => 
    [lastName:Veromo\Bundle\CoreBundle\Entity\FirstQuestions:private] => 
    [email:Veromo\Bundle\CoreBundle\Entity\FirstQuestions:private] => 
    [birthday:Veromo\Bundle\CoreBundle\Entity\FirstQuestions:private] => 
    [shoeSize:Veromo\Bundle\CoreBundle\Entity\FirstQuestions:private] => 
    [id:Veromo\Bundle\CoreBundle\Entity\Questionnaire:private] => 
) 

這表明,所有我做的不同,以您在使用我自己的開發環境的命名空間。

的appbundle \實體\ Questionnaire.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Questionnaire 
* 
* @ORM\Entity 
* @ORM\Table(name="questionnaire") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"questionnaire"="Questionnaire", "firstquestions" = "FirstQuestions", "secondquestions" = "SecondQuestions"}) 
*/ 
abstract class Questionnaire { 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

的appbundle \實體\ FirstQuestions。PHP

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* FirstQuestions 
* @ORM\Entity() 
*/ 
class FirstQuestions extends Questionnaire { 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="firstName", type="string", length=64) 
    */ 
    private $firstName; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="lastName", type="string", length=64) 
    */ 
    private $lastName; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=32) 
    */ 
    private $email; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="birthday", type="date") 
    */ 
    private $birthday; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="shoeSize", type="integer") 
    */ 
    private $shoeSize; 

    /** 
    * Set firstName 
    * 
    * @param string $firstName 
    * 
    * @return Questionnaire 
    */ 
    public function setFirstName($firstName) 
    { 
     $this->firstName = $firstName; 

     return $this; 
    } 

    /** 
    * Get firstName 
    * 
    * @return string 
    */ 
    public function getFirstName() 
    { 
     return $this->firstName; 
    } 

    /** 
    * Set lastName 
    * 
    * @param string $lastName 
    * 
    * @return Questionnaire 
    */ 
    public function setLastName($lastName) 
    { 
     $this->lastName = $lastName; 

     return $this; 
    } 

    /** 
    * Get lastName 
    * 
    * @return string 
    */ 
    public function getLastName() 
    { 
     return $this->lastName; 
    } 

    /** 
    * Set email 
    * 
    * @param string $email 
    * 
    * @return Questionnaire 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    /** 
    * Get email 
    * 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * Set birthday 
    * 
    * @param \DateTime $birthday 
    * 
    * @return Questionnaire 
    */ 
    public function setBirthday($birthday) 
    { 
     $this->birthday = $birthday; 

     return $this; 
    } 

    /** 
    * Get birthday 
    * 
    * @return \DateTime 
    */ 
    public function getBirthday() 
    { 
     return $this->birthday; 
    } 

    /** 
    * Set shoeSize 
    * 
    * @param integer $shoeSize 
    * 
    * @return Questionnaire 
    */ 
    public function setShoeSize($shoeSize) 
    { 
     $this->shoeSize = $shoeSize; 

     return $this; 
    } 

    /** 
    * Get shoeSize 
    * 
    * @return integer 
    */ 
    public function getShoeSize() 
    { 
     return $this->shoeSize; 
    } 
} 

的appbundle \實體\ SecondQuestions.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* SecondQuestions 
* @ORM\Entity() 
*/ 
class SecondQuestions extends Questionnaire { 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteIceCream", type="string", length=128) 
    */ 
    private $favoriteIceCream; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteSuperHero", type="string", length=32) 
    */ 
    private $favoriteSuperHero; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="favoriteMovieStar", type="string", length=64) 
    */ 
    private $favoriteMovieStar; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="endOfTheWorld", type="date") 
    */ 
    private $endOfTheWorld; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="superBowlWinner", type="string", length=32) 
    */ 
    private $superBowlWinner; 

    /** 
    * Set favoriteIceCream 
    * 
    * @param string $favoriteIceCream 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteIceCream($favoriteIceCream) 
    { 
     $this->favoriteIceCream = $favoriteIceCream; 

     return $this; 
    } 

    /** 
    * Get favoriteIceCream 
    * 
    * @return string 
    */ 
    public function getFavoriteIceCream() 
    { 
     return $this->favoriteIceCream; 
    } 

    /** 
    * Set favoriteSuperHero 
    * 
    * @param string $favoriteSuperHero 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteSuperHero($favoriteSuperHero) 
    { 
     $this->favoriteSuperHero = $favoriteSuperHero; 

     return $this; 
    } 

    /** 
    * Get favoriteSuperHero 
    * 
    * @return string 
    */ 
    public function getFavoriteSuperHero() 
    { 
     return $this->favoriteSuperHero; 
    } 

    /** 
    * Set favoriteMovieStar 
    * 
    * @param string $favoriteMovieStar 
    * 
    * @return Questionnaire 
    */ 
    public function setFavoriteMovieStar($favoriteMovieStar) 
    { 
     $this->favoriteMovieStar = $favoriteMovieStar; 

     return $this; 
    } 

    /** 
    * Get favoriteMovieStar 
    * 
    * @return string 
    */ 
    public function getFavoriteMovieStar() 
    { 
     return $this->favoriteMovieStar; 
    } 

    /** 
    * Set endOfTheWorld 
    * 
    * @param \DateTime $endOfTheWorld 
    * 
    * @return Questionnaire 
    */ 
    public function setEndOfTheWorld($endOfTheWorld) 
    { 
     $this->endOfTheWorld = $endOfTheWorld; 

     return $this; 
    } 

    /** 
    * Get endOfTheWorld 
    * 
    * @return \DateTime 
    */ 
    public function getEndOfTheWorld() 
    { 
     return $this->endOfTheWorld; 
    } 

    /** 
    * Set superBowlWinner 
    * 
    * @param string $superBowlWinner 
    * 
    * @return Questionnaire 
    */ 
    public function setSuperBowlWinner($superBowlWinner) 
    { 
     $this->superBowlWinner = $superBowlWinner; 

     return $this; 
    } 

    /** 
    * Get superBowlWinner 
    * 
    * @return string 
    */ 
    public function getSuperBowlWinner() 
    { 
     return $this->superBowlWinner; 
    } 
} 

的appbundle \控制器\ TestController.php

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Request; 
use AppBundle\Entity\Questionnaire; 
use AppBundle\Entity\FirstQuestions; 
use AppBundle\Entity\SecondQuestions; 

class TestController extends Controller 
{ 
    /** 
    * @Route("/test",name="test") 
    */ 
    public function indexAction(Request $request) 
    { 
     $item = new FirstQuestions(); 
     return new Response(
      '<pre>'.print_r($item, true).'</pre>' 
     ); 
    } 
} 

而只是要確定...

應用程序\ CONFIG \ routing.yml中

test: 
    resource: "@AppBundle/Controller/TestController.php" 
    type:  annotation 

這一定是有些愚蠢的,惱人的小錯誤,沒有人正在尋找。

希望這有助於...

+0

非常感謝你的幫助,男人。愚蠢的我,問題是我沒有清理/應用程序/緩存目錄和新的變化與註釋因爲它沒有生效。現在一切正常,我可以創建子對象。 –

+0

太棒了!聽到那個消息很開心。 – Ragdata

1

所有屬於映射實體層次結構一部分的實體類都需要在@DiscriminatorMap中指定。所以,是的,你的註釋是不正確的。

Doctrine Single Table Inheritance

編輯

你有另一個註解錯誤 - 既不是你的子類中有一個@Entity註解:

/** 
* FirstQuestions 
* @ORM\Entity() 
*/ 
class FirstQuestions extends Questionnaire { 

/** 
* SecondQuestions 
* @ORM\Entity() 
*/ 
class SecondQuestions extends Questionnaire { 

解決這個我能夠使用Doctrine的架構更新後工具來構建表併成功創建了一個FirstQuestions對象。

+0

我已經改變了@DiscriminatorMap的註釋和說明類問卷有太多: @ORM \ DiscriminatorMap({ 「調查問卷」= 「問卷」, 「firstquestions」=「FirstQuestions 「,」secondquestions「=」SecondQuestions「}) 但仍然有這個問題 –

+0

@Regdata是啊,我已經試圖改變註釋在你的例子中,也嘗試將屬性的範圍從private改爲protected。但沒有什麼幫助,仍然有這個錯誤。 –

+0

@Regdata您的解決方案成功運作非常棒,所以我仍然不會失望,我也能夠解決這個問題。你能否告訴我所有的代碼,包括你創建FirstQuestions對象的方法? –

相關問題