2015-09-25 3 views
1

У меня есть файл /src/AppBundle/Entity/Questionnaire.php с 3 классами сущностей, где я пытаюсь реализовать наследование одиночной таблицы с помощью Doctrine 2 на Symfony 2,7. Анкета является родителем абстрактный класс, и есть 2 дочерние классы FirstQuestions и SecondsQuestions, что расширяет Анкета. Я выбрал эту модель, потому что мне нужно записать данные в таблицу за 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; 
    } 
} 

Таким образом, проблема, когда я пытаюсь создать объект дочернего класса (FirstQuestions или SecondsQuestions) в методе контроллера, Symfony дисплеев me error «Внутренняя ошибка сервера». Код контроллера с методом приведен ниже:

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] => 
) 

Это показывает, что все, что я делаю по-другому к вам с помощью пространств имен моего собственного Dev среды.

AppBundle \ Entity \ 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 \ Entity \ 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 \ Entity \ 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 \ Controller \ 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

Большое вам спасибо за помощь, человек. Глупый вопрос: проблема в том, что я не очищал каталог/app/cache, а новые изменения с аннотациями не вступили в силу из-за этого. Теперь все работает, и я могу создавать дочерние объекты. –

+0

Удивительный! Рад слышать это. – Ragdata

1

Все классы объектов, которые являются частью иерархии сопоставленных объектов, должны быть указаны в @DiscriminatorMap. Итак, да, ваша аннотация неверна.

Doctrine Single Table Inheritance

EDIT

У вас есть другая ошибка аннотаций - ни ваших подклассов имеет @Entity аннотацию:

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

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

После фиксации этого я был в состоянии использовать схемы Update Doctrine в инструмент для создания таблиц И успешно создал объект FirstQuestions.

+0

Я изменил аннотацию @DiscriminatorMap и описан класс Анкета там тоже: @ORM \ DiscriminatorMap ({ "опросник" = "Анкета", "firstquestions" = «FirstQuestions »,« secondquestions »=« SecondQuestions »}) Но все еще есть эта проблема –

+0

@Regdata Да, я уже пытался изменить аннотации, как в вашем примере, также пытался изменить область свойств от частного до защищенного. Но ничего не помогло, все еще есть эта ошибка. –

+0

@Regdata Замечательно, что ваше решение успешно работало, поэтому я до сих пор не теряю надежды на то, что я тоже смогу решить эту проблему. Не могли бы вы показать мне, пожалуйста, весь ваш код, включая контроллер, с помощью метода, где вы создаете объект FirstQuestions? –

Смежные вопросы