diff --git a/library/Zend/ServiceManager/ServiceManager.php b/library/Zend/ServiceManager/ServiceManager.php index c953a4f29ea..75e419f87ca 100644 --- a/library/Zend/ServiceManager/ServiceManager.php +++ b/library/Zend/ServiceManager/ServiceManager.php @@ -419,16 +419,21 @@ public function get($name, $usePeeringServiceManagers = true) } while ($this->hasAlias($cName)); } - if (isset($this->instances[$cName])) { - return $this->instances[$cName]; - } - $instance = null; $retrieveFromPeeringManagerFirst = $this->retrieveFromPeeringManagerFirst(); if ($usePeeringServiceManagers && $retrieveFromPeeringManagerFirst) { $instance = $this->retrieveFromPeeringManager($name); + + if(null !== $instance) { + return $instance; + } } + + if (isset($this->instances[$cName])) { + return $this->instances[$cName]; + } + if (!$instance) { if ($this->canCreate(array($cName, $name))) { $instance = $this->create(array($cName, $name)); diff --git a/tests/ZendTest/ServiceManager/ServiceManagerTest.php b/tests/ZendTest/ServiceManager/ServiceManagerTest.php index 2a9eb8e35a7..067f4460d85 100644 --- a/tests/ZendTest/ServiceManager/ServiceManagerTest.php +++ b/tests/ZendTest/ServiceManager/ServiceManagerTest.php @@ -667,4 +667,36 @@ public function testDuplicateNewInstanceMultipleAbstractFactories() $this->assertInstanceOf('ZendTest\ServiceManager\TestAsset\Bar', $this->serviceManager->get('bar')); $this->assertInstanceOf('ZendTest\ServiceManager\TestAsset\Bar', $this->serviceManager->get('bar')); } + + /** + * @covers Zend\ServiceManager\ServiceManager::setService + * @covers Zend\ServiceManager\ServiceManager::get + * @covers Zend\ServiceManager\ServiceManager::retrieveFromPeeringManagerFirst + * @covers Zend\ServiceManager\ServiceManager::setRetrieveFromPeeringManagerFirst + * @covers Zend\ServiceManager\ServiceManager::addPeeringServiceManager + */ + public function testRetrieveServiceFromPeeringServiceManagerIfretrieveFromPeeringManagerFirstSetToTrueAndServiceNamesAreSame() + { + $foo1 = "foo1"; + $boo1 = "boo1"; + $boo2 = "boo2"; + + $this->serviceManager->setService($foo1, $boo1); + $this->assertEquals($this->serviceManager->get($foo1), $boo1); + + $serviceManagerChild = new ServiceManager(); + $serviceManagerChild->setService($foo1, $boo2); + $this->assertEquals($serviceManagerChild->get($foo1), $boo2); + + $this->assertFalse($this->serviceManager->retrieveFromPeeringManagerFirst()); + $this->serviceManager->setRetrieveFromPeeringManagerFirst(true); + $this->assertTrue($this->serviceManager->retrieveFromPeeringManagerFirst()); + + $this->serviceManager->addPeeringServiceManager($serviceManagerChild); + + $this->assertContains($serviceManagerChild, $this->readAttribute($this->serviceManager, 'peeringServiceManagers')); + + $this->assertEquals($serviceManagerChild->get($foo1), $boo2); + $this->assertEquals($this->serviceManager->get($foo1), $boo2); + } }