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 по умолчанию, поэтому вы получите тот же объект.