Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF][Symfony][Symfony2] Czy zarejestrować klasę jako service?
404
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

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


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.

Ten post edytował 404 9.09.2014, 19:33:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
404
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

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


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 (IMG:style_emoticons/default/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.

Ten post edytował 404 13.09.2014, 00:41:43
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: 5.10.2025 - 23:24