![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 10.10.2015 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Panie boże, męczę ten temat od tygodnia.
http://symfony.com/doc/2.8/components/depe...ompilation.html Zacząłem od nauki service container w oficjalnym podręczniku. Tam wszystko jasne, jak dla opóźnionych w rozwoju. To lubię. Na początku tego tematu jest notka "chcesz wiedzieć więcej czytaj o komponencie Dependency Injection". No to dobrze, przeczytam. Zaczyna się bez problemów: rejestracja serwisów w php w obiekcie ContainerBundle, dodawanie parametrów, argumentów. Ładowanie istniejącyh plików konfiguracyjnych. Modyfikacja definicji serwisów. Az przychodzi rozdział "Compiling the Container" (w pdf chapter 38). a konkretnie sekcja "Managing Configuration with Extension". (na 5 stronach w pdf) I tu już nie rozumiem nic. Do tej pory wszystko było jasne: - Definiuję serwisy w yml (albo xml, albo php) w swoim bundlu w resources/config/services.yml. Importuję ten plik konfiguracyjny w app/config - Natomiast, gdy chcę by bundel był wyodrębniony i używany w innych projektach to trzeba zadbać o to by serwisy bundla zarejestrować w klasie Extension (implementującej ExtensionInterface) by serwisy były dostępne po prezniesieniu bundla do nowego projektu. By to zrobić trzeba załadować pliki konfiguracyjne w metodzie load()
Ale to co dalej jest opisywane na kolejnych stronach (pdf) to jest sajgon. - "The Extension must specify a getAlias method to implement the interface."
- jaki interfejs? po co? ( musi? a w klasie Extension FOSRestBundle tej metody nie ma. - For YAML configuration files specifying the alias for the extension as a key will mean that those values are passed to the Extension's load method
- co? Dobra nie będę dalej cytował kolejnych fragmentów, mam pokreślony cały rozdział pytaniami, alei tak nikt mi nie odpowie na te pytania. Ale jakby komuś się chciało to tak z grubsza jaka jest idea tego rozdziału? Kiedy mam tego używać? Do czego jest klasa Extension? Czym jest parametr $configs metody load() ? (a na końcu tego rozdziału jest notka "In the full-stack framework the compilation and caching of the container is taken care of for you. W google i na stackoverfolw nie ma nic co dotyczy COMPILING CONTAINER. Ktoś tego w ogóle używa? ) =========================================== =====edit=================================== macie rację, może zacznę od nauki yamla. Ten post edytował koszykarze 27.01.2016, 23:06:59 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Cytat - Nie rozumiem co mi da dynamiczna zmiana definicji serwisu skoro i tak muszę ręcznie zmienić klasę, na której opiera się serwis? Co mi da np dynamiczne dodanie argumentu konstruktora serwisu, skoro i tak ręcznie muszę dopisać ten argument w klasie ? (W klasie Container w cache są tylko tworzone obiekty. Czyli klasy muszę ręcznie modyfikować.) Odniosę się do tej wypowiedzi.Cytat - Nie rozumiem co mi da dynamiczna zmiana definicji serwisu skoro i tak muszę ręcznie zmienić klasę, na której opiera się serwis? Zmień sposób myślenia. Nie myśl implementacją, tylko interfacem/abstrakcją. Jak masz usługę np. security, która korzysta z klasy komponentu symfony, to sobie możesz w swoim pakiecie o nazwie np. SecurityExtra, a konkretnie w compilePass() pobrać definicję ten usługi i zmienić jej klasę na swoją, byle by się interface zgadzał. Możesz też udekorować taką usługę, bardziej szczegółoto jest to opisane tutaj: http://symfony.com/doc/current/components/...rating-services Po wykonaniu powyższych manewrów klasy, które korzystają z tej usługi nie są świadome zmian, jakie zaszły, bo interface się zgadza a Ty jesteś zadowolony z dodania nowej funkcjonalności do tej usługi. Ma to zastosowanie zwłaszcza w gotowych już projektach, gdzie trzeba bez ruszania kodu aplikacji coś pozmieniać, pododawać. Cytat Co mi da np dynamiczne dodanie argumentu konstruktora serwisu, skoro i tak ręcznie muszę dopisać ten argument w klasie Tak, jak powyżej opisałem. Nadpisując definicję usługi możesz podać swoją klasę, która może mieć zupełnie inny konstruktor (o ile interface go nie definiuje). Poza tym budowa kontenera usług i definicji nie ogranicza się do konstruktora, jest to dużo bardziej zaawansowany twór, możesz np. napisać pakiet, który taguje zdefiniowane w konfiguracji usługi odpowiednimi tagami (do tagowania usług pewnie dojdziesz, taguje się np. event listenery/subscribery aby były rozpoznawane przez framework jako właśnie listenery/subscribery).Cytat (W klasie Container w cache są tylko tworzone obiekty. Czyli klasy muszę ręcznie modyfikować.) Ale możesz zrobić opcjonalne argumenty, które w zależności od konfiguracji są podawane albo i nie. Możesz dodać wywołania metod (przykład z dokumentacji kontenera usług, chodzi o opcję "calls"):
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 02:51 |