Миграция 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
, Такой подход был необходим на заводах для Hydrator
s, Controller
и другие услуги, которые имеют свои собственные ServiceManager
s. Потому что для них вход 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?
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);
...
}