2013-09-08 17 views
15

Uczę się zf2, czytanie dokumentów, samouczków itp. Z sieci. Teraz jestem zdezorientowany odnośnie do Zend\ServiceManager\ServiceManagerAwareInterface.php i Zend\ServiceManager\ServiceLocatorAwareInterface.php.zf2 ServiceManager vs ServiceLocator

także w pewnym miejscu (jak Controller) używam $this->getServiceLocator() aby pobrać obiekt ServiceManager natomiast w niektórych innych miejscach używamy ->getServiceManager() a także zwraca taką samą ServiceManager obiekt.

+0

@Sam, Dlaczego potrzebujemy obu metod wtedy? – haim770

+0

Ale dlaczego są dwa interfejsy. 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php' i' Zend \ ServiceManager \ ServiceLocatorAwareInterface.php'. Jeśli SM jest implementacją SL, dlaczego mamy oddzielny interfejs. –

Odpowiedz

16

Lokalizator jest interfejsem. Projektowanie Zend Framework 2 odbywa się za pomocą "design by contract", co oznacza, że ​​polegasz na interfejsach, a nie na klasach. Menedżer jest domyślną implementacją Lokalizatora.

Wszystkie części oprócz jednego używają Lokalizatora. Jednak menedżer zapewnia więcej funkcji niż mówi interfejs. Zend\Mvc\Application używa tych funkcji i dlatego opiera się na Menadżerze zamiast Lokalizatora.

Decyzja o użyciu lokalizatora w inicjalizatorach * Aware została wprowadzona zbyt późno, aby zwolnić wersję, dlatego też istnieje zarówno wersja ServiceLocatorAwareInterface, jak i ServiceManagerAwareInterface. Był już kod użytkownika przy użyciu inicjalizatora Menedżera, więc jest zachowywany dla kompatybilności wstecznej. Wewnętrznie wszystkie komponenty używają inicjatora lokalizatora. Jeśli musisz wybrać, wybierz Lokalizatora i odłóż Menedżera na ile to możliwe.

Jakiś czas temu również blogu o Locator i kierownik: https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

5

Interfejs ServiceManager jest w zasadzie implementacją interfejsu ServiceLocator. Powodem posiadania tych dwóch elementów jest to, że użytkownik może mieć własną implementację interfejsu ServiceLocator. Kiedy poprosisz o ->getServiceManager(), zwróci ci to jednoznaczną implementację ServiceManager. Korzystając z usługi ->getServiceLocator(), użytkownik żąda dowolnej implementacji interfejsu ServiceLocator, która może być implementacją przez ServiceManager lub własną. Ale jak zwykle jest tylko domyślna impelmentacja ServiceManager, więc otrzymasz ten sam obiekt.

+0

który ma sens, ale znowu, dlaczego mamy 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php'. i jakie podejście powinno się zastosować? –

+2

Trzymam się 'ServiceLocator', ponieważ ma on również dostępną cechę, więc używam tej cechy i nie muszę implementować SL/SM na własną rękę w kółko. – Bryan