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
@ Сэм, зачем нам тогда нужны оба метода?   -  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 выполняется по принципу «проектирование по контракту», что означает, что вы полагаетесь на интерфейсы, а не на классы. Менеджер является реализацией Локатора по умолчанию.

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

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

Некоторое время назад я также писал в своем блоге о Locator и Manager: 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