Zajmuję się tworzeniem aplikacji przy użyciu Symfony 2, który jest skonstruowany tak, że „Core” pakiet określa podmioty, relacje i pól. Inne pakiety mogą następnie specjalizować podstawową funkcjonalność przez dziedziczenie, tak zwane pakiety "podrzędne".
Adnotacje Doctrine 2 zostały użyte do zdefiniowania głównej jednostki o nazwie "Pakiet". "Pakiet" łączy ze sobą projekt architektoniczny i kawałek ziemi - zasadniczo pakiet domu i ziemi. Zredukowaliśmy przykłady do bardziej podstawowej postaci, więc nie znajdziesz definicji Land i ChildLand w poniższych przykładach, ale możesz założyć, że zostały one zaimplementowane w podobny sposób.
Aktualizacja
Według użytkowników na kanale #symfony FreeNode, ten problem jest doktryna jako polecenie app/console po prostu wywołuje konsolę doktryny. Używam doktryny 2.3.
Oto schemat przedstawiający ogólną sytuację, która powoduje problem, który powinien pomóc wyobrazić sobie scenariusz:
(imgur link to full-size image)
Również tutaj jest link do raportu o błędzie na emisyjnej trackera doktryny : http://www.doctrine-project.org/jira/browse/DDC-2605
Update 2 - szczegółowe ERD
Th Struktura relacji między podmiotami została zakwestionowana, dlatego poniższy przykład jest lepszym przykładem struktury danych, którą wdrażamy.
Głównym wymaganiem jest ponownie posiadanie klas podstawowych, które udostępniają wspólny zestaw jednostek i pól. Klasy dziecięce w pakietach firm rozszerzają te podstawowe klasy.
Uznaliśmy EAV za długi, ale w tym podejściu spędzimy dużo więcej czasu, tworząc platformę i narzędzia do zarządzania danymi EAV, zamiast spełniać obecne wymagania biznesowe, nie będziemy mogli używać doktryny do zarządzaj jednostkami takimi, jak będą one zdefiniowane w bazie danych, itp. itd.
W miarę upływu czasu i zaczynam rozumieć ten problem lepiej, wydaje się, że jedynym problemem jest z pobierającymi i ustawiaczy generowanych przez narzędzie CLI doktryny, jak się łamią umowy typu "hinting", o których mowa poniżej. Ta struktura działa doskonale, gdy problemy te są ręcznie korygowane.
(imgur link to full-size image)
Generowanie Podmioty z CLI narzędzie
Więc początkowo użyłem narzędzia wiersza polecenia ...
> app/console doctrine:generate:entity
...do generowania odcinki Podmiot o podstawowych odwzorowań pól, a następnie ręcznie dodane relacji do ziemi (jako narzędzie nie wydają się potwierdzać relacje):
To otrzymany kod:
rdzeń jednostka Opakowanie: http://pastebin.com/3ujPT1mJ
dziecko jednostka Opakowanie: http://pastebin.com/sjAB0XJ2
generowanie pobierające i ustawiające
Następnie wygenerować z pobierające i ustawiające przez wykonanie:
> app/console doctrine:generate:entities CompanyCoreBundle
> app/console doctrine:generate:entities CompanyChildBundle
Które automatycznie modyfikuje podstawowych i podmiot dziecko definicje:
rdzeń podmiot Opakowanie: http://pastebin.com/kfQRxcnm
dziecko jednostka Opakowanie: http://pastebin.com/UdiPP9xX
problemu!
więc sedno problemu jest taka: Jeśli porównać funkcję setLand w wiązce podstawowej i dziecko można zobaczyć deklaracje są różne:
public function setLand(\Company\CoreBundle\Entity\Land $land = null)
public function setLand(\Company\ChildBundle\Entity\ChildLand $land = null)
Błędy :(
Niestety, różne podpowiedzi typu PHP powodować błędy występują ścisłe, na przykład:
PHP Fatal error: Class 'Symfony\Component\Debug\Exception\ContextErrorException' not found in ... Company/ChildBundle/Entity/ChildPackage.php on line ...
A
Runtime Notice: Declaration of ... should be compatible with ... in ... line ...
przyczyną błędów
Po robi jakieś badania, dlaczego to był problem, czytałem w kilku miejscach, że zmiana typów parametrów w podklasy przerwy typów parametrów umów (zobacz stanowisko: Is there a way to redefine a type hint to a descendant class when extending an abstract class?).
Opcje?
Istnieją pewne oczywiste, ale mniej niż idealne opcje:
- mogę stłumić surowe zawiadomień dość łatwo, ale mój kierownik rozwój Graniaki perspektywą konieczności tworzenia wyjątków płatka śniegu w naszych procesów CI.
- Mogę ręcznie edytować kod generowany przez doktrynę w celu usunięcia wszystkich typów podpowiedzi lub upewnić się, że podpowiedzi typu klasy dziecka są takie same jak klasy nadrzędne. Dzięki temu kod działa, ale widzę, że jest to nudne, chyba że piszę skrypty, aby to dla mnie zarządzać.
- Nie mogę po prostu użyć narzędzi wiersza poleceń i ręcznie ręcznie utworzyć moje jednostki i podelementy. Wolałbym zautomatyzować to za pomocą skryptów :(
Moje pytanie !!!(na końcu)
Moje pytanie brzmi, czy można używać narzędzi wiersza poleceń do robienia tego, co próbuję tutaj zrobić? Idealnie, chciałbym móc wykonywać polecenia konsoli doktryny, aby generować encje encji i pobierające i ustawiające, bez ręcznej interwencji do naprawiania podpowiedzi typu w podklasach. Jeśli nie jest to łatwe do osiągnięcia, jaka jest najlepsza opcja?
Wdzięczność
Dzięki!
pomogłoby to? http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html – jmlnik
Nie bez drastycznego przemyślenia mojego podejścia. Po pierwsze, potrzebowałbym interfejsu dla każdego związku. Drugi i prawdopodobnie główny powód jest taki, że zgodnie z dokumentacją "ResolveTargetEntityListener może zmienić cel tylko na pojedynczy obiekt", podczas gdy ja będę musiał rozszerzyć podstawową funkcjonalność na wiele dzieci, więc będę miał "XPackage", "YPackage" itp. Dziękuję za odpowiedź, ale nie wiedziałem o tej funkcjonalności i na pewno będę ją uwzględniał w przyszłych scenariuszach. –
Pytasz o kawałek kodu, w którym widać, że doktryna nie może obsłużyć sytuacji, w której odziedziczona klasa zastąpiła właściwość relacji? –