![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 10.10.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
w dokumentacji są dwa słowa o dekoratorze:
- dekorator nadpisuje ale nie likwiduje nadpisywanej usługi - stara nazwa (dekorowanej usługi) jest aliasem dla nowej nazwy (usługi dekoratora) Nie rozumiem jaka jest korzyść używania dekoratora przy nadpisywaniu usług w Extension. Co mogę takiego zrobić dekoratorem czego nie mógłbym zrobić zwykłą edycją usługi? Przecież i tak dekorator będzie wywoływany starą nazwą usługi, więc nie mogę już w projekcie użyć starej wersji dekorowanej usługi. edit. i po co używać factory skoro mogę dowolnie edytować usługę w Extension? Ten post edytował koszykarze 27.07.2016, 23:38:27 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Wiesz o tym, że nadpisywanie to co innego niż dekorowanie? Przecież dekorator potrzebuje starej usługi, jeżeli chcesz tylko nadpisać i zapomnieć o starej usłudze to nie potrzebujesz dekoratora. Ale to wszystko masz przecież opisane w dokumentacji, w pierwszych zdaniach spod załączonego przez Ciebie adresu.
Po to możesz skorzystać z factory, żeby wykorzystać fabrykę Twoich obiektów. Extension (moim zdaniem) ma całkiem inne zadanie od fabryki, służu raczej do ułatwienia konfiguracji DiC a nie do tworzenia obiektów. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 10.10.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
no ale jak nie nadpisuje skoro nadpisuje.
poniższe sprawia, że wywołując serwis 'old' mam zawartość klasy Klasa1, gdy początkowo serwis ma klasę Klasa
(a jest to skopiowane z dokumentacji) ale już taki zapis nie nadpisuje. Tj. oba serwisy używają innej klasy
Ten post edytował koszykarze 28.07.2016, 23:33:22 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Strasznie mieszasz. W pierwszym Twoim przykładzie oryginalną usługą jest 'old' i dekorujesz ją usługą 'dekorator'. Sprawdzanie co ma 'dekorator' nie ma żadnego sensu bo to jest oczywiste. Sprawdź co po takim dekorowaniu zawiera usługa 'old'.
Znasz w ogóle wzorzec dekoratora? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 10.10.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
masz rację, pomyliłem słowa w poprzednim poście.
Edytowałem poprzedniego posta z "poniższe sprawia, że wywołując serwis 'dekorator'", na "poniższe sprawia, że wywołując serwis 'old'" sens postu ten sam. Nadpisuje cholerstwo! i jeszcze cytat z dokumentacji: "The visibility of the decorated foo service (which is an alias for bar) will still be the same as the original foo visibility." (mniejsza o visibility. Piszą, że nazwa dekorowanej usługi staje się aliasem usługi dekoratora, czyli wywołując usługę nazwą foo -wywołuję dekoratora. Wiem, że bez sensu, ale tak to rozumiem) a propo wzorca dekorator, tak sobie zanotowałem, "dekorator to alternatywa dla dziedziczenia (dziedziczenie rozszerza klasy w trakcie kompilacji, dekoratory w trakcie działania programu). dekorator przechowuje referencję do komponentu i opakowuje jego metody. wykorzystywany W DYNAMICZNYM TWORZENIU KLAS w trakcie działania programu." skoro alternatywa dla dziedziczenia to wolałbym móc używać i klasę/usługę dekorowaną i dekoratora. Ten post edytował koszykarze 28.07.2016, 23:49:17 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Cytat skoro alternatywa dla dziedziczenia to wolałbym móc używać i klasę/usługę dekorowaną i dekoratora. Proszę bardzo, Symfony Ci to umożliwia. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 10.10.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Oto moje wnioski:
tworząc dekorator za pomocą new DefinitionDecorator: - mam nową usługę z nową nazwą dziedzicząc definicję old - mam w projekcie dostęp do starej i nowej usługi - nowa nazwa usługi nie nadpisuje starej - używam klasy zdefiniowanej w starej usłudze - tu chodzi tylko o udekorowanie definicji usługi, tak by można było użyć w projekcie i starej i nowej usługi. tworząc dekorator za pomocą $container->register()->setDecoratedService : - mam nową usługę ze starą nazwą i zmienioną definicją - mam w projekcie dostęp tylko do tej jednej usługi - nowa nazwa usługi nadpisuje starą - podaję nazwę nowej klasy, tam wstrzykuję stary serwis i wykorzystuję jego funkcjonalność - w projekcie stara usługa jest nadpisana ale w Extension i CompilerPass mogę wielokrotnie użyć definicji starej usługi do tworzenia nowych dekoratorów. - to jest prawdziwy dekorator klas Ten post edytował koszykarze 29.07.2016, 17:04:09 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 08:16 |