Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF2][SF][Symfony2]Managing Configuration with Extensions. Ktoś to rozumie? Ktoś tego używał?, DependencyInjection
koszykarze
post
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()
  1. class AcmeDemoExtension implements ExtensionInterface
  2. {
  3. public function load(array $configs, ContainerBuilder $container)
  4. {
  5. $loader = new XmlFileLoader(
  6. $container,
  7. new FileLocator(__DIR__.'/../Resources/config')
  8. );
  9. $loader->load('services.xml');
  10. }
  11. // ...
  12. }


Ale to co dalej jest opisywane na kolejnych stronach (pdf) to jest sajgon.
- "The Extension must specify a getAlias method to implement the interface."
  1. class AcmeDemoExtension implements ExtensionInterface
  2. {
  3. // ...
  4. public function getAlias()
  5. {
  6. return 'acme_demo';
  7. }
  8. }

- 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

  1. # ...
  2. acme_demo:
  3. foo: fooValue
  4. bar: barValue

- 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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
koszykarze
post
Post #2





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 10.10.2015
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


fantastycznie. Bardzo pomocne.


===========
EDIT:
===========
mam kilka wątpliwości, ale możecie je zlekceważyć, bo chyba łatwo znajdę odpowiedzi. Mimo wszystko je tu zapiszę i usunę post od razu, gdy znajdę odpowiedzi. Głośno myślę. (będę edytował ten post)

(nie cytuję dosłownie)

1. -Crozin pisał "nie ma czegoś takiego jak bundle wewnętrzy i wyodrębniony, wszystkie działają tak samo".

No, ale jednak dla bundle stworzonego przeze mnie, pliki konfiguracyjne tj. serwisy z resources/config/services.yml są importowane w app/config dzięki czemu serwisy są widoczne w całym projekcie.

Natomiast 3rd party bundle nie mają dostępu do mojego app/config stąd developer bundle'a musi niejako od swojej strony zadbać o to, by serwisy z tego bundle były po przeniesieniu widoczny w projekcie użytkownika, dlatego w Extension trzeba rejestrować serwisy. W zasadzie, gdyby ktoś nie chciał dawać możliwości konfiguracji bundle'a to nie musiałby tworzyć Extension, wystarczyłoby importować serwisy w app/config. (hmmm acha i chyba to miał na myśli crozin mówiąc, że bundle się nie różnią)


2. Czy te frazy znaczą to samo w kontekście miejsca gdzie definiuję usługę np plik service.yml?
[configuration files][service configuration][container configuration]

(ja ciągle pisząc, myśląc o plikach konfiguracyjnych, tak wynikało dla mnie z podręcznika, myślałem o definicjach serwisów w services.yml z dyrektywami service, parameters i to wszystko. Nie wiedziałem, że tu też chodzi o dynamiczne opcje dla bundle jako parametr w metodzie load w Extension.)

3. "W klasach Extension można w zależności od ustawien w plikach konfiguracyjnych bundle'a tworzyć, modyfikować definicje serwisów"

A co mi da dynamiczna zmiana definicji serwisu skoro i tak muszę ręcznie zmienić klasę na której opiera się serwis? Co mi da dynamiczne dodanie argumentu konstruktora serwisu, skoro i tak ręcznie muszę dopisać ten argument w klasie ?

- "Jak już wszystkie definicje usług i relacje między nimi zostaną zdefiniowane, to wtedy framework przystępuje do faktycznego tworzenia obiektów usług "

framework tworzy obiekty na podstawie definicji?

- no tak co się dziwisz. Obiekty, nie klasy.

acha. Nie no czekaj, a zawartość metod tych serwisów? Je też można zdefiniować w Extension?

-czytaj dalej dokumentację

4. ........

Ten post edytował koszykarze 29.01.2016, 03:15:46
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.10.2025 - 16:59