diff --git a/library/Zend/ServiceManager/Di/DiAbstractServiceFactory.php b/library/Zend/ServiceManager/Di/DiAbstractServiceFactory.php index 616ed25670c..50b57077b6d 100644 --- a/library/Zend/ServiceManager/Di/DiAbstractServiceFactory.php +++ b/library/Zend/ServiceManager/Di/DiAbstractServiceFactory.php @@ -51,10 +51,18 @@ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $ */ public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) { - return $this->instanceManager->hasSharedInstance($requestedName) + if ($this->instanceManager->hasSharedInstance($requestedName) || $this->instanceManager->hasAlias($requestedName) || $this->instanceManager->hasConfig($requestedName) || $this->instanceManager->hasTypePreferences($requestedName) - || $this->definitions->hasClass($requestedName); + ) { + return true; + } + + if (! $this->definitions->hasClass($requestedName) || interface_exists($requestedName)) { + return false; + } + + return true; } } diff --git a/tests/ZendTest/Mvc/Service/TranslatorServiceFactoryTest.php b/tests/ZendTest/Mvc/Service/TranslatorServiceFactoryTest.php index 33cfda945a5..329862d3108 100644 --- a/tests/ZendTest/Mvc/Service/TranslatorServiceFactoryTest.php +++ b/tests/ZendTest/Mvc/Service/TranslatorServiceFactoryTest.php @@ -10,6 +10,8 @@ namespace ZendTest\Mvc\Service; use PHPUnit_Framework_TestCase as TestCase; +use Zend\Mvc\Service\RoutePluginManagerFactory; +use Zend\Mvc\Service\ServiceManagerConfig; use Zend\Mvc\Service\TranslatorServiceFactory; use Zend\ServiceManager\ServiceManager; @@ -74,6 +76,48 @@ public function testReturnsTranslatorBasedOnConfigurationWhenNoTranslatorInterfa ); } + public function testReturnsTranslatorBasedOnConfigurationWhenNoTranslatorInterfaceServicePresentWithMinimumBootstrap() + { + if (!extension_loaded('intl')) { + $this->markTestSkipped('This test will only run if ext/intl is present'); + } + + //minimum bootstrap + $applicationConfig = array( + 'module_listener_options' => array(), + 'modules' => array(), + ); + $serviceLocator = new ServiceManager(new ServiceManagerConfig()); + $serviceLocator->setService('ApplicationConfig', $applicationConfig); + $serviceLocator->get('ModuleManager')->loadModules(); + $serviceLocator->get('Application')->bootstrap(); + + //enable to re-write Config + $ref = new \ReflectionObject($serviceLocator); + $prop = $ref->getProperty('allowOverride'); + $prop->setAccessible(true); + $prop->setValue($serviceLocator, true); + + $config = array( + 'di' => array(), + 'translator' => array( + 'locale' => 'en_US', + ), + ); + + $serviceLocator->setService('Config', $config); + + //#5959 + //get any plugins with AbstractPluginManagerFactory + $routePluginManagerFactory = new RoutePluginManagerFactory; + $routePluginManager = $routePluginManagerFactory->createService($serviceLocator); + + $translator = $this->factory->createService($serviceLocator); + $this->assertInstanceOf('Zend\Mvc\I18n\Translator', $translator); + $this->assertInstanceOf('Zend\I18n\Translator\Translator', $translator->getTranslator()); + + } + /** * @depends testReturnsTranslatorBasedOnConfigurationWhenNoTranslatorInterfaceServicePresent */