0

In den Factory Klassen meines Zend Framework 2-Anwendung, ich eine solche Konstruktion oft verwendet:ZF2 zu ZF3 migrieren: Heiss um den "realServiceLocator" zu konvertieren?

// 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); 
    ... 
} 

So eine „gemeinsame“ Dienst zuzugreifen, ich abgerufen zuerst die ServiceLocator. Dieser Ansatz war in Fabriken für Hydrator s, Controller s und andere Dienste notwendig, die ihre eigenen ServiceManager s haben. Denn für sie war der Eingang ServiceLocatorAbstractPluginManager und nicht der Zend\ServiceManager\ServiceManager.

Jetzt habe ich den ersten Migrationsschritt für meine Fabriken und ersetzt einige gemeinsame Dinge:

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); 
    ... 
} 

Wie die $container->getServiceLocator() zum ZF3 anzupassen?

+0

Es lohnt sich bei der Migration Guide für ZF3 Service-Manager suchen zu machen, das Plugin-Manager Abschnitt erläutert, wie Plugin-Manager geändert haben, http://zendframework.github.io/zend-servicemanager/migration/#plugin-managers Im Abschnitt "AbstractPluginManager" (die Klasse, von der alle Zend Component Plugin-Manager erben) wird erklärt, dass der Konstruktor nun die übergeordnete Container-Instanz als erste akzeptiert Streit; Dies ist normalerweise die ServiceManager-Instanz auf Anwendungsebene. "Im Falle von ZF-Plugin-Managern erhalten Sie den' $ realServiceLocator' als '$ -Container' in Ihren Plugin-Factories – Crisp

Antwort

3

getServiceLocator() ist veraltet, so dass Sie diese nicht in ZF3 verwenden können. Sie wäre in der Lage, den Service-Manager zur Verfügung mit einer Instanz von Interop\Container\ContainerInterface während Fabriken wie die folgende

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