![]() |
![]() |
![]()
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: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wygląda na to, że jednak nie rozumiesz poprawnie sposobu działania tego komponentu FW. Najpierw kilka sprostowań:
Cytat rejestracja serwisów w php w obiekcie ContainerBundle Nie ma czegoś takiego jak ContainerBundle. Chodziło Ci zapewne o ContainerBuildera? Jeśli nie napisz co miałeś na myśli.Cytat 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. Nie ma żadnego podziału na bundle "wewnętrzne" i "wyodrębnione" - wszystkie działają w dokładnie ten sam sposób, włącznie z bundle'ami samego Symfony.Cytat Ale to co dalej jest opisywane na kolejnych stronach (pdf) to jest sajgon. Po co używać interfejsów pisać nie będę, bo jest tego masa w sieci. FOSRestBundle nie jest tu żadnym wyjątkiem, tylko jego metoda getAlias() jest... odziedziczona z Symfony\Component\DependencyInjection\Extension\Extension.- "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. Cytat - For YAML configuration files specifying the alias for the extension as a key will mean that those values Oznacza to, że jeżeli Twój bundle zwraca z metody ...Extension::getAlias() wartość "abc_def_ghi" to w konfiguracji w pliku app/config/config.yml będziesz korzystać właśnie z tego klucza by określić jego konfigurację, która później zostanie przekazana jako zwykła tablica do ...Extension::load() w celu dalszego przetworzenia.are passed to the Extension's load method [...] - co? --- Jak działa ten komponent w uproszczeniu w standardowej konfiguracji? Zakładamy, że mamy wyczyszczony cache. 1. Każdy bundle rejestrowany jest przy pomocy klasy MySuperBundle, która implementuje BundleInterface, który to definiuje metodę getContainerExtension() zwracającą właśnie obiekt klasy rozszerzenia (może tego nie robić, ale to rzadkie w tym przypadku). 2. Pliki konfiguracyjne YAML z app/config są scalane w jeden (config_prod.yml ma na początku wczytanie config.yml, a ten z kolei wczytuje sobie parameters.yml i security.yml). Odpowiedzialne są za to "reguły" IMPORTS. 3. Gdzieś wewnątrz bebechów Symfony rozpoczyna się proces kompilacji kontenera. Tworzony jest obiekt ContainerBuilder. 4. Dla każdego zarejestrowanego bundle'a odpalana jest metoda BundleInterface::build(), a w przypadku, gdy dany bundle posiada rozszerzenie uruchamiana jest metoda ExtensionInterface::load(). Dla tej ostatniej przekazany jest dodatkowy parametr - konfiguracja spod klucza określonego przez ExtensionInterface::getAlias(). 5. To co się dzieje wewnątrz ExtensionInterface::load() to już sprawa wyłącznie danego rozszerzenia, ale standardowy model to: (na przykładzie FrameworkExtension czyli podstawowego bundle'a samego Symfony) 5.1. Wczytanie definicji serwisów/parameterów z plików YAML/XML z Resources/config przy pomocy Yaml/XmlFileLoader. Definicji serwisów, a nie samych serwisów! 5.2. Jakieś bardziej dynamiczne tworzenie/modyfikowanie definicji serwisów/parametrów na podstawie konfiguracji z app/config/config.yml 6. Uruchamiana jest metoda BundleInterface::build 7. Punkty 4 - 6 uruchamiane są dla każdego bundle'a. 8. W czasie budowania można właściwie w każdym momencie (w praktyce jest to punkt 6.) dodać ContainerBuilderowi obiekty, które jeszcze na samym końcu wykonają na nim jakieś prace (CompilerPass). Po co? Ponieważ są one wtedy wstanie pracować na "całości" (pamiętaj, że bundle uruchamiane są w kolejności ich rejestracji). Sztandarowym przykładem będzie tutaj przykładowo wybranie wszystkich definicji zawierających tag XYZ i dodanie im czegoś, albo użycie ich w jakieś formie. 9. Gdy już wszystko zostało przetworzone całość zapisywana jest w var/cache/prod/...container.php jako kod PHP, a właściwie potężna klasa z metodami zwracającymi serwisy, stąd nazwa "kompilacji kontenera". We wszystkich powyższych punktach pracowaliśmy na ContainerBuilderze, który zawierał jedynie definicje seriwsów, a na końcu tego procesu skończyliśmy z jednym plikiem zawierającym konkretny kod, który jest dopiero wykorzystywany przez framework (Dependency Injection Container / Service Contaienr). W przypadku, gdy już mamy w cache kontener punkty 2 - 9 nie wykonują się - wszystko jest już gotowe/dostępne. Ten post edytował Crozin 28.01.2016, 09:28:28 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 18.10.2025 - 13:35 |