Zf2 ServiceManager vs ServiceLocator
Я изучаю zf2, читаю документы, учебные пособия и т.д. из Интернета. Теперь я смущен относительно Zend\ServiceManager\ServiceManagerAwareInterface.php
и Zend\ServiceManager\ServiceLocatorAwareInterface.php
.
Также в некотором месте (например, контроллере) я использую $this->getServiceLocator()
для извлечения объекта ServiceManager
, а в некоторых других местах мы используем ->getServiceManager()
, а также возвращает тот же объект ServiceManager
.
Ответы
Ответ 1
Локатор - это интерфейс. Дизайн Zend Framework 2 выполняется с помощью "проекта по контракту", что означает, что вы полагаетесь на интерфейсы, а не на классы. Менеджер - это реализация Локатора по умолчанию.
Все, кроме одного компонента, используют локатор. Однако менеджер предоставляет больше возможностей, чем говорит интерфейс. Zend\Mvc\Application
использует эти функции и поэтому полагается на Менеджера вместо Locator.
Решение об использовании Locator в инициализаторах * Aware было сделано слишком поздно для выпуска, поэтому именно поэтому есть ServiceLocatorAwareInterface
и ServiceManagerAwareInterface
. Уже был пользовательский код, используя инициализатор Manager, чтобы он сохранялся для обратной совместимости. Внутри всех компонентов используется инициализатор Locator. Если вам нужно выбрать, выберите Locator и оставите Менеджера как можно больше.
Совсем недавно я также писал о локаторе и менеджере: https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application
Ответ 2
ServiceManager
- это в основном реализация интерфейса ServiceLocator
. Причина наличия двух заключается в том, что пользователь может иметь собственную реализацию интерфейса ServiceLocator
. Когда вы запрашиваете ->getServiceManager()
, он возвращает явную реализацию ServiceManager
. Используя ->getServiceLocator()
, вы запрашиваете любую реализацию интерфейса ServiceLocator
, которая может быть реализована ServiceManager
или вашей собственной. Но так как в большинстве случаев существует только префикс ServiceManager
по умолчанию, поэтому вы получите тот же объект.