diff --git a/src/Illuminate/Container/Container.php b/src/Illuminate/Container/Container.php index 8c31eb26c103..155948fe6ee7 100755 --- a/src/Illuminate/Container/Container.php +++ b/src/Illuminate/Container/Container.php @@ -633,9 +633,13 @@ public function refresh($abstract, $target, $method) */ protected function rebound($abstract) { + if (! $callbacks = $this->getReboundCallbacks($abstract)) { + return; + } + $instance = $this->make($abstract); - foreach ($this->getReboundCallbacks($abstract) as $callback) { + foreach ($callbacks as $callback) { $callback($this, $instance); } } diff --git a/tests/Container/ResolvingCallbackTest.php b/tests/Container/ResolvingCallbackTest.php index 91a749710388..b8d7facf2ccc 100644 --- a/tests/Container/ResolvingCallbackTest.php +++ b/tests/Container/ResolvingCallbackTest.php @@ -282,7 +282,44 @@ public function testParametersPassedIntoResolvingCallbacks() $container->make(ResolvingContractStub::class); } - public function testResolvingCallbacksAreCallWhenRebindHappenForResolvedAbstract() + public function testResolvingCallbacksAreCallWhenRebindHappens() + { + $container = new Container; + + $resolvingCallCounter = 0; + $container->resolving(ResolvingContractStub::class, function () use (&$resolvingCallCounter) { + $resolvingCallCounter++; + }); + + $rebindCallCounter = 0; + $container->rebinding(ResolvingContractStub::class, function () use (&$rebindCallCounter) { + $rebindCallCounter++; + }); + + $container->bind(ResolvingContractStub::class, ResolvingImplementationStub::class); + + $container->make(ResolvingContractStub::class); + $this->assertEquals(1, $resolvingCallCounter); + $this->assertEquals(0, $rebindCallCounter); + + $container->bind(ResolvingContractStub::class, ResolvingImplementationStubTwo::class); + $this->assertEquals(2, $resolvingCallCounter); + $this->assertEquals(1, $rebindCallCounter); + + $container->make(ResolvingImplementationStubTwo::class); + $this->assertEquals(3, $resolvingCallCounter); + $this->assertEquals(1, $rebindCallCounter); + + $container->bind(ResolvingContractStub::class, fn () => new ResolvingImplementationStubTwo); + $this->assertEquals(4, $resolvingCallCounter); + $this->assertEquals(2, $rebindCallCounter); + + $container->make(ResolvingContractStub::class); + $this->assertEquals(5, $resolvingCallCounter); + $this->assertEquals(2, $rebindCallCounter); + } + + public function testResolvingCallbacksArentCalledWhenNoRebindingsAreRegistered() { $container = new Container; @@ -297,18 +334,16 @@ public function testResolvingCallbacksAreCallWhenRebindHappenForResolvedAbstract $this->assertEquals(1, $callCounter); $container->bind(ResolvingContractStub::class, ResolvingImplementationStubTwo::class); - $this->assertEquals(2, $callCounter); + $this->assertEquals(1, $callCounter); $container->make(ResolvingImplementationStubTwo::class); - $this->assertEquals(3, $callCounter); + $this->assertEquals(2, $callCounter); - $container->bind(ResolvingContractStub::class, function () { - return new ResolvingImplementationStubTwo; - }); - $this->assertEquals(4, $callCounter); + $container->bind(ResolvingContractStub::class, fn () => new ResolvingImplementationStubTwo); + $this->assertEquals(2, $callCounter); $container->make(ResolvingContractStub::class); - $this->assertEquals(5, $callCounter); + $this->assertEquals(3, $callCounter); } public function testRebindingDoesNotAffectMultipleResolvingCallbacks()