Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][Symfony][Symfony2] Czy zarejestrować klasę jako service?
Forum PHP.pl > Forum > PHP > Frameworki
404
Witam,

w AdministrationBundle mam 3 klasy: NavigationMenu, NavigationMenuItem i NavigationMenuLoader. Klasa NavigationMenuLoader odpowiada za ładowanie menu z pliku YAML. Podczas parsowania tego pliku tworzy obiekty NavigationMenu i NavigationMenuItem. Mniej więcej wygląda to tak:
  1. $navigationMenu = new NavigationMenu();
  2. // ...
  3. for(/* ... */) {
  4. $navigationMenuItem = new NavigationMenuItem();
  5. $navigationMenuItem->setTitle($data['title']);
  6.  
  7. $items[] = $navigationMenuItem;
  8. }
  9. // ...
  10. $navigationMenu->setItems($items);
Zastanawiam się, czy powinienem te klasy rejestrować jako usługi. Gdybym tak zrobił musiałbym ustawić ich scope na prototype, a do NavigationMenuLoader przekazać container i odwoływać się na zasadzie:
  1. $navigationMenu = $this->container->get('navigation_menu');
  2. // ...
  3. for(/* ... */) {
  4. $navigationMenuItem = $this->container->get('navigation_menu_item');
  5. $navigationMenuItem->setTitle($data['title']);
  6.  
  7. $items[] = $navigationMenuItem;
  8. }
  9. // ...
  10. $navigationMenu->setItems($items);

Dodam, iż te klasy nie będą wykorzystywane w żadnym innym bundle.
MLukasz
Zależy po co chcesz te serwisy. Jeśli to sztuka dla sztuki, to zostawiłbym tak jak jest, przynajmniej dopóki te klasy nie mają jakiś zależności, które trzeba im wstrzyknąć. Natomiast na pewno taka zmiana sprawiłaby, że ten kod byłby łatwiejszy do ogarnięcia testami unitowymi. W takim przypadku jednak nie wstrzykiwałbym całego containera. Navigation Menu spokojnie możesz dać w jednym egzemplarzu, zaś jeśli chodzi o itemy, to chyba zastosowałbym tu fabrykę, która byłaby zarejstrowana jako serwis i za każdym razem zwracałaby Ci nowy egzemplarz itema - bo zapewne o to Ci chodzi smile.gif.
404
Cytat
Zależy po co chcesz te serwisy
Tak naprawdę to wykorzystuję "na zewnątrz" tylko NavigationMenuLoader. Dlatego też postanowiłem zarejestrować tą klasę (i tylko tą) jako service.
Cytat
(...)zastosowałbym tu fabrykę, która byłaby zarejestrowana jako serwis i za każdym razem zwracałaby Ci nowy egzemplarz itema(...)
Spróbuję, dzięki smile.gif

// Update.

Spróbowałem.
Kod
# Navigation menu.
navigation_menu:
    class: '%navigation_menu.class%'
    scope: 'prototype'

# Navigation menu item factory.
navigation_menu_item_factory:
    class: '%navigation_menu_item_factory.class%'

# Navigation mnue item.
navigation_menu_item:
    class: '%navigation_menu_item.class%'
    factory_method: 'create'
    factory_service: 'navigation_menu_item_factory'
    scope: 'prototype'

# Navigation menu loader service.
navigation_menu_loader:
    calls:
        - [ 'setNavigationMenu', [ '@navigation_menu' ] ]
        - [ 'setNavigationMenuItem', [ '@navigation_menu_item' ] ]
    class: '%navigation_menu_loader.class%'
    scope: 'prototype'

  1. class NavigationMenuLoader {
  2. public function foo1() {
  3. $navigationMenu = $this->getNavigationMenu();
  4. // ...
  5. }
  6.  
  7. public function foo2() {
  8. $navigationMenuItem = $this->getNavigationMenuItem();
  9. // ...
  10. }
  11. }
Działa.
Nie rozumiem tylko jednej rzeczy. Dlaczego trzeba ustawić scope navigation_menu_item na prototype? Albo coś źle skonfigurowałem albo nie do końca rozumiem jak ma działać fabryka.
skowron-line
http://symfony.com/doc/current/cookbook/se...standing-scopes

polecam do servicow i routingu pliki xml jest podpowiadanie skladni smile.gif
404
Jak działa prototype to się orientuję, ale dlaczego trzeba go użyć w przypadku fabryki, która teoretycznie powinna sama z siebie za każdym razem zwracać nowe instancje obiektów?

Cytat
polecam do servicow i routingu pliki xml jest podpowiadanie skladni(...)
Korzystam z PhpStorma wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.