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
lukaskolista
post
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"):
  1. app.newsletter_manager:
  2. class: AppBundle\Newsletter\NewsletterManager
  3. calls:
  4. - [setMailer, ['@app.mailer']]
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 11.10.2025 - 02:51