Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][Symfony2][SF2] Entities i dziedziczenie.
blackroger
post 17.12.2012, 03:11:00
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował blackroger 17.12.2012, 03:29:40
Go to the top of the page
+Quote Post
mortus
post 17.12.2012, 08:53:30
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
blackroger
post 17.12.2012, 11:14:10
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 09:32