Миграция ZF2 в ZF3: как быстро преобразовать realServiceLocator?

В классах Factory моего приложения Zend Framework 2 я часто использовал такую ​​конструкцию:

// The signature was actually wrong, since it was always the `AbstractPluginManager` (or the `Zend\ServiceManager\ServiceManager` for the "common" services) and not just `ServiceLocator`, and it also was used as `AbstractPluginManager` (or `ServiceManager` for the "common" services). The `ServiceLocatorInterface` did not provide the `getServiceLocator()` method.
public function createService(ServiceLocatorInterface $serviceLocator)
{
    // the common ServiceLocator
    $realServiceLocator = $serviceLocator->getServiceLocator();
    $myServiceFoo = $realServiceLocator->get('My\Service\Foo');
    $myServiceBar = new \My\Service\Bar($myServiceFoo);
    ...
}

Итак, чтобы получить доступ к «общему» сервису, я сначала получил файл ServiceLocator. Такой подход был необходим на фабриках для Hydrators, Controllers и других сервисов, у которых есть свои ServiceManagers. Потому что для них ввод ServiceLocator был AbstractPluginManager, а не Zend\ServiceManager\ServiceManager.

Теперь я сделал первый шаг миграции для своих заводов и заменил некоторые общие вещи:

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
    // the common ServiceLocator
    $realServiceLocator = $container->getServiceLocator();
    $myServiceFoo = $realServiceLocator->get('My\Service\Foo');
    $myServiceBar = new \My\Service\Bar($myServiceFoo);
    ...
}

Как адаптировать $container->getServiceLocator() к ZF3?


person automatix    schedule 24.06.2017    source источник
comment
Стоит посмотреть руководство по миграции для диспетчера служб ZF3, в разделе диспетчера подключаемых модулей объясняется, как изменились диспетчеры подключаемых модулей, zendframework.github.io/zend-servicemanager/migration/ В разделе AbstractPluginManager (класс, от которого наследуются все менеджеры подключаемых модулей компонентов Zends) объясняется, что конструктор теперь принимает экземпляр родительского контейнера. как первый аргумент; обычно это экземпляр ServiceManager уровня приложения. В случае менеджеров плагинов ZF вы получаете $realServiceLocator как $container в своих фабриках плагинов.   -  person Crisp    schedule 24.06.2017


Ответы (1)


getServiceLocator() устарел, поэтому вы не можете использовать его в ZF3. Вы могли бы сделать диспетчер служб доступным, используя экземпляр Interop\Container\ContainerInterface, создавая фабрики следующим образом.

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
    $myServiceFoo = $container->get('My\Service\Foo');
    $myServiceBar = new \My\Service\Bar($myServiceFoo);
    ...
}
person unclexo    schedule 24.06.2017