2015-09-25 232 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对象的方法? –

相关问题