Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF]Po co mi dekorator w nadpisywaniu usług w Extension? przecież mogę nadpisać usługę dowolnie bez dekoratora
koszykarze
post
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
Go to the top of the page
+Quote Post
destroyerr
post
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.
Go to the top of the page
+Quote Post
koszykarze
post
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
  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);


Ten post edytował koszykarze 28.07.2016, 23:33:22
Go to the top of the page
+Quote Post
destroyerr
post
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?
Go to the top of the page
+Quote Post
koszykarze
post
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
Go to the top of the page
+Quote Post
destroyerr
post
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.
Go to the top of the page
+Quote Post
koszykarze
post
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 08:16