2013-09-08 3 views
15

Я изучаю zf2, читаю документы, учебные пособия и т. Д. Из Интернета. Теперь я смущен относительно Zend\ServiceManager\ServiceManagerAwareInterface.php и Zend\ServiceManager\ServiceLocatorAwareInterface.php.zf2 ServiceManager vs ServiceLocator

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

+0

@ Сэм, Зачем нам нужны оба метода тогда? – haim770

+0

Но почему существуют два интерфейса. 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php' и' Zend \ ServiceManager \ ServiceLocatorAwareInterface.php'. Если SM - это реализация SL, почему у нас есть отдельный интерфейс. –

ответ

16

Локатор - это интерфейс. Дизайн Zend Framework 2 выполняется с помощью «проекта по контракту», что означает, что вы полагаетесь на интерфейсы, а не на классы. Менеджер - это реализация Локатора по умолчанию.

Все, кроме одного компонента, используют локатор. Однако менеджер предоставляет больше возможностей, чем говорит интерфейс. Zend\Mvc\Application использует эти функции и поэтому полагается на Менеджера вместо Locator.

Решение об использовании локатора в инициализаторах * Aware было сделано слишком поздно для выпуска, поэтому именно поэтому есть и ServiceLocatorAwareInterface, и ServiceManagerAwareInterface. Был уже код userland с использованием инициализатора менеджера, поэтому он поддерживается для обратной совместимости. Внутри всех компонентов используется инициализатор Locator. Если вам нужно выбрать, выберите Locator и оставите Менеджера в максимально возможной степени.

Некоторое время назад я писал о локатора и Менеджером: https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

5

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

+0

, что имеет смысл, но опять же, почему у нас есть 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php'. и какой подход, по вашему мнению, следует использовать. –

+2

Я придерживаюсь 'ServiceLocator', так как у него также есть черта, поэтому я просто использую эту черту и не должен повторно использовать SL/SM самостоятельно. – Bryan