Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony2][SF2] Entities i dziedziczenie.
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
Witam. Mam problem z dostosowaniem środowiska pod moje wymagania.

Używam mysql-workbench-exporter do generowania klas annotation entities w katalogu Entity. I teraz próbuje stworzyć mechanizm podobny do tego używanego w symfony 1.4. Exporter generuje klasy, ja natomiast chcę po tych klasach dziedziczyć i rozszerzać je według potrzeb. Chcę uczynić ten proces w pełni automatycznym:
1. Generowanie klas Entities z workbencha,
2. Update schemy,
3. Zmiany manualne w klasach dziedziczących.

Poniżej przykład tego co chcę osiągnąć:
1. Plik generowany z workbencha:
  1. namespace Project\DatabaseBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4.  
  5. /**
  6.  * Project\DatabaseBundle\Entity\Article
  7.  *
  8.  * @ORM\MappedSuperclass
  9.  * @ORM\Entity(repositoryClass="ArticleRepository")
  10.  * @ORM\Table(name="article")
  11.  */
  12. class ArticleBase
  13. {
  14. /**
  15.   * @ORM\Id
  16.   * @ORM\Column(type="integer")
  17.   * @ORM\GeneratedValue(strategy="AUTO")
  18.   */
  19. protected $id;
  20.  
  21. /**
  22.   * @ORM\Column(type="string", length=255, nullable=true)
  23.   */
  24. protected $title;
  25.  
  26. public function __construct()
  27. {
  28. }
  29.  
  30. /**
  31.   * Set the value of id.
  32.   *
  33.   * @param integer $id
  34.   * @return \Project\DatabaseBundle\Entity\Article
  35.   */
  36. public function setId($id)
  37. {
  38. $this->id = $id;
  39.  
  40. return $this;
  41. }
  42.  
  43. /**
  44.   * Get the value of id.
  45.   *
  46.   * @return integer
  47.   */
  48. public function getId()
  49. {
  50. return $this->id;
  51. }
  52.  
  53. /**
  54.   * Set the value of title.
  55.   *
  56.   * @param string $title
  57.   * @return \Project\DatabaseBundle\Entity\Article
  58.   */
  59. public function setTitle($title)
  60. {
  61. $this->title = $title;
  62.  
  63. return $this;
  64. }
  65.  
  66. /**
  67.   * Get the value of title.
  68.   *
  69.   * @return string
  70.   */
  71. public function getTitle()
  72. {
  73. return $this->title;
  74. }
  75.  
  76. public function __sleep()
  77. {
  78. return array('id', 'title');
  79. }
  80. }


2. Plik dziedziczący po ArticleBase:

  1. namespace Project\DatabaseBundle\Entity;
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4.  
  5. /**
  6.  * Project\DatabaseBundle\Entity\Article
  7.  *
  8.  */
  9. class Article extends ArticleBase
  10. {
  11.  
  12. }


Pojawił mi się problem... A mianowicie ogólnodostępny exporter workbencha, co udało mi się przeanalizować (może nie zauważyłem tam jakiejś opcji) generuje tylko klasy z domyślną nazwą (nie można wymusić żeby zamiast Article wygenerował nazwę ArticleBase), co niestety nie pozwala na prawidłowe działanie Entities (klasa instancji domyślnie musi mieć zawsze nazwę Article). I teraz pytanie. Czy ktoś już kiedyś zastanawiał się nad takim problemem i znalazł rozwiązanie? Może istnieje jakiś prostszy sposób na to? Może można w inny sposób dojść do tego samego? Bo inaczej to zostaje już tylko grzebanie w kodzie tego exportera...
Zastanawia mnie też dlaczego nigdzie nie mogę znaleźć tak typowego przykładu z dziedziczeniem klas entities jako podstawowego rozwiązania dla modelu... Mieszanie w podstawowych klasach jest dobre, jak model jest tworzony bezpośrednio z pliku annotations, ale dla źródeł zewnętrznych bez klasy bazowej raczej się nie obejdzie...


Dodatkowo jeszcze prośba o zweryfikowanie powyższych klas, bo wyrzuca błąd przy SQL w mapowaniu klasy.
W kontrolerze korzystam z kodu:
  1. $articleObj = new Article();
  2. $articleObj->setTitle('aa');
  3.  
  4. $em = $this->getDoctrine()->getManager();
  5. $em->persist($articleObj);
  6. $em->flush();
  7.  



An exception occurred while executing 'INSERT INTO Article (title) VALUES (?)' with params {"1":"aa"}:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'livesoft_test.Article' doesn't exist


Zaznaczam, że bez dziedziczenia problem nie występuje. Prośba o poprawienie kodu, bo już nie wiem w czym jest problem. Jeszcze raz trzeba te annotacje dot. klasy pisać?
mortus
Być może ten wątek pozwoli odpowiedzieć na Twoje pytania. Odsyłam również do dokumentacji Doctrine. Zwróć uwagę, że "mapped superclass cannot be an entity", zatem adnotacje @ORM\Entity i @ORM\Table powinieneś przenieść do klasy Article.

Jeśli chodzi o WORKBENCH-a to nie znalazłem pluginu, którego nazwę wymieniłeś. Znalazłem natomiast mysql-workbench-schema-exporter, ale jest to świeży projekt i raczej nie ma zaimplementowanych wszystkich funkcjonalności.
blackroger
Ok rozumiem... dzięki... rzeczywiście nie zauważyłem tego: "mapped superclass cannot be an entity". Nadpisanie klasy dziedziczącej parametrami dot. entity załatwia sprawę. Jeżeli chodzi o exportera to tak masz rację, chodzi o mysql-workbench-schema-exporter. Przejrzałem tamten kod i dodałem przy generowaniu frazę MappedSuperclass oraz pozmieniałem Article -> ArticleBase.

Dzięki za pomoc. Tak jak napisałem dziwię się nadal, że w sf2 nie opracowano jeszcze tak przydatnego mechanizmu generowania schemy z klasami bazowymi... W sf1 działało to idealnie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.