В классах 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
s и других сервисов, у которых есть свои 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?
$realServiceLocator
как$container
в своих фабриках плагинов. - person Crisp   schedule 24.06.2017