zf2 ServiceManager срещу ServiceLocator

Уча zf2, чета документи, уроци и т.н. от мрежата. Сега съм объркан относно Zend\ServiceManager\ServiceManagerAwareInterface.php и Zend\ServiceManager\ServiceLocatorAwareInterface.php.

Също така на някое място (като контролер) използвам $this->getServiceLocator() за извличане на обекта ServiceManager, докато на някои други места използваме ->getServiceManager() и той също връща същия обект ServiceManager.


person M Hill    schedule 08.09.2013    source източник
comment
@Sam, тогава защо се нуждаем и от двата метода?   -  person haim770    schedule 08.09.2013
comment
Но защо има два интерфейса. Zend\ServiceManager\ServiceManagerAwareInterface.php и Zend\ServiceManager\ServiceLocatorAwareInterface.php. Ако SM е имплементацията на SL, защо имаме отделен интерфейс.   -  person M Hill    schedule 08.09.2013


Отговори (2)


Локаторът е интерфейсът. Дизайнът на Zend Framework 2 е направен с "проектиране по договор", което означава, че разчитате на интерфейси, а не на класове. Мениджърът е изпълнение по подразбиране на локатора.

Всички компоненти освен един използват локатора. Мениджърът обаче предоставя повече функции, отколкото казва интерфейсът. Zend\Mvc\Application използва тези функции и следователно разчита на мениджъра вместо на локатора.

Решението за използване на локатора в *Aware инициализаторите беше взето твърде късно за изданието, така че това е причината да има както ServiceLocatorAwareInterface, така и ServiceManagerAwareInterface. Вече имаше потребителски код, използващ инициализатор на мениджъра, така че се запазва за обратна съвместимост. Вътрешно всички компоненти използват инициала на локатора. Ако трябва да избирате, изберете локатора и оставете мениджъра колкото е възможно повече настрана.

Преди доста време също писах в блог за локатора и мениджъра: https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

person Jurian Sluiman    schedule 08.09.2013

ServiceManager е основно изпълнението на интерфейса ServiceLocator. Причината за наличието на двете е, че потребителят може да има своя собствена реализация на интерфейса ServiceLocator. Когато поискате ->getServiceManager(), той ви връща изричното изпълнение на ServiceManager. Използвайки ->getServiceLocator(), вие изисквате всяка реализация на интерфейса ServiceLocator, която може да бъде реализация от ServiceManager или ваша собствена. Но тъй като в повечето случаи има само изпълнение по подразбиране ServiceManager, така че ще получите същия обект.

person Bryan    schedule 08.09.2013
comment
това има някакъв смисъл, но отново защо имаме Zend\ServiceManager\ServiceManagerAwareInterface.php. и кой подход мислите, че трябва да се използва. - person M Hill; 08.09.2013
comment
аз се придържам към ServiceLocator, тъй като той също има налична черта, така че просто използвам чертата и не се налага сам да прилагам SL/SM отново и отново. - person Bryan; 08.09.2013