fifjak
7.08.2014, 08:12:57
Taka sytuacja. Powiedzmy że chcecie zrobić następującą strukturę encji:
1. Klasa A implementuje interface I
2. Klasa B implementuje interface I
3. Klasa C
Klasa C posiada jakieś własności, wśród których jedna z nich może przechowywać instancje obiektu klasy A lub instancje obiektu klasy B, czyli ustawiam sobie typ tej własności w klasie C na interface I. Problem pojawia się w momencie, kiedy chcę pobrać dane z DB ponieważ muszę w yaml'u zdefiniować jaki obiekt powinien zostać utworzony podczas ustawiania tej własności. Jeśli ustawię tam typ na klasę A to zawsze będzie tam tworzyć obiekty klasy A - tak samo z klasą B. Nie mogę podać tam interface'u I, bo jak każdemu wiadomo, nie można napisać "new I".
Co powiedzieć doctrine, żeby on wiedział jaki obiekt ma utworzyć - A lub B. Wydaje mi się, że powinien tu zostać utworzony złożony klucz obcy (ID oraz typ, który będzie określać jaka klasa powinna zostać wykorzystana do utworzenia obiektu). Jak to wszystko skonfigurować, żeby doctrine utworzył taki klucz?
adbacz
8.08.2014, 06:59:03
Jeśli masz aż taką zależność, to śmiem twierdzić, że wczesniej podeszłeś do problemu troszkę inaczej, niż można było to rozwiązać, i teraz wyszedł kolejny problem.
Podałeś powyżej przykład bez podawania jego konkretnego zastosowania. Mógłbyś napisać czym tak na prawdę są te klasy i czym się zajmują? Może zamiast rozwiązywać ten problem, można sprawić, żeby zniknęła jedna z tych klas (jeśli w ogóle się da) - w tedy nie będzie tego problemu.
fifjak
13.08.2014, 09:34:59
W porządku, konkretne zastosowanie.
Temat to plany pracy. Na planie znajdują się jakieś zadania. "Obsługą" tych zadań może zajmować się pojedyncza osoba lub grupa osób - nazwijmy ich właścicielami zadań. W kodzie pojedynczą osobę reprezentuje klasa A, a grupę klasa B. Obie klasy różnią się między sobą. Teraz potrzebuję gdzieś wyświetlić informację o właścicielu. Żeby uniknąć sytuacji typu if ($wlasciciel instanceof KlasaA){....}else if($wlasciciel instanceof KlasaB) itd., chcę zrobić interfejs, który będę implementować w tych dwóch klasach i w każdej nowej, która by jeszcze mogła powstać. W ten sposób, kod za pomocą którego wyświetlamy informacje o właścicielu nie będzie się zmieniać pod wpływem dodania nowego typu właściciela zadania i nie będzie wymagał dodatkowych modyfikacji testów jednostkowych.
Dopowiem jeszcze, że ten problem mam w symfony 2.
Crozin
13.08.2014, 09:48:31
Musisz skorzystać z dziedziczenia (na poziomie Doctrine'a). Szczerze, nie jestem pewien czy mechanizm ten zadziała wyłącznie na samych interfejsach bez bezpośredniego dziedziczenia w PHP, ale powinien dać radę.
http://doctrine-orm.readthedocs.org/en/lat...ce-mapping.html
fifjak
19.08.2014, 10:49:57
@Crozin, sprawdzę co i jak i dam znać
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.