Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF]Po co mi dekorator w nadpisywaniu usług w Extension? przecież mogę nadpisać usługę dowolnie bez dekoratora
Forum PHP.pl > Forum > PHP > Frameworki
koszykarze
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?
destroyerr
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.
koszykarze
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
  1. $container->register('dekorator', 'Klasa1')
  2. ->setPublic(true)
  3. ->setDecoratedService('old');

(a jest to skopiowane z dokumentacji)

ale już taki zapis nie nadpisuje. Tj. oba serwisy używają innej klasy
  1. $indexDef = new DefinitionDecorator('old');
  2. $indexDef->setClass('Klasa1')
  3. ->setPublic(true);
  4. $container->setDefinition('dekorator', $indexDef);
destroyerr
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?
koszykarze
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.
destroyerr
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.
koszykarze
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

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.