diff --git a/src/Illuminate/Foundation/Http/Kernel.php b/src/Illuminate/Foundation/Http/Kernel.php index 83a5ae42780c..3760a4d8c4ba 100644 --- a/src/Illuminate/Foundation/Http/Kernel.php +++ b/src/Illuminate/Foundation/Http/Kernel.php @@ -12,7 +12,7 @@ use Illuminate\Routing\Pipeline; use Illuminate\Routing\Router; use Illuminate\Support\Carbon; -use Illuminate\Support\Facades\Facade; +use Illuminate\Support\Facades\Request; use Illuminate\Support\InteractsWithTime; use InvalidArgumentException; use Throwable; @@ -165,7 +165,7 @@ protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); - Facade::clearResolvedInstance('request'); + Request::clearResolvedInstance(); $this->bootstrap(); diff --git a/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php b/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php index ecaa4fdd38f4..14b4234f6c28 100644 --- a/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php +++ b/src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php @@ -6,7 +6,7 @@ use Illuminate\Foundation\Mix; use Illuminate\Foundation\Vite; use Illuminate\Support\Defer\DeferredCallbackCollection; -use Illuminate\Support\Facades\Facade; +use Illuminate\Support\Facades\Vite as ViteFacade; use Illuminate\Support\HtmlString; use Mockery; @@ -123,7 +123,7 @@ protected function withoutVite() $this->originalVite = app(Vite::class); } - Facade::clearResolvedInstance(Vite::class); + ViteFacade::clearResolvedInstance(); $this->swap(Vite::class, new class extends Vite { diff --git a/src/Illuminate/Support/Facades/Facade.php b/src/Illuminate/Support/Facades/Facade.php index f5ce6aab2fe5..33e3cae9f2ae 100755 --- a/src/Illuminate/Support/Facades/Facade.php +++ b/src/Illuminate/Support/Facades/Facade.php @@ -247,12 +247,12 @@ protected static function resolveFacadeInstance($name) /** * Clear a resolved facade instance. * - * @param string $name + * @param ?string $name * @return void */ - public static function clearResolvedInstance($name) + public static function clearResolvedInstance($name = null) { - unset(static::$resolvedInstance[$name]); + unset(static::$resolvedInstance[$name ?? static::getFacadeAccessor()]); } /** diff --git a/tests/Support/SupportFacadeTest.php b/tests/Support/SupportFacadeTest.php index 82035ecfc1e4..f8fb6afa002e 100755 --- a/tests/Support/SupportFacadeTest.php +++ b/tests/Support/SupportFacadeTest.php @@ -80,6 +80,40 @@ public function testExpectsReturnsAMockeryMockWithExpectationRequired() $this->assertInstanceOf(MockInterface::class, $mock = FacadeStub::expects('foo')->with('bar')->andReturn('baz')->getMock()); $this->assertSame('baz', $app['foo']->foo('bar')); } + + public function testFacadeResolvesAgainAfterClearingSpecific() + { + $app = new ApplicationStub; + $app->setAttributes(['foo' => $mock = m::mock(stdClass::class)]); + $mock->shouldReceive('bar')->times(3)->andReturn('baz'); + + // Resolve for the first time + FacadeStub::setFacadeApplication($app); + $this->assertSame('baz', FacadeStub::bar()); + + // Clear resolved instance and resolve the second time + FacadeStub::clearResolvedInstance(); + $this->assertSame('baz', FacadeStub::bar()); + + // Clear resolved instance through parent and resolve the third time + Facade::clearResolvedInstance('foo'); + $this->assertSame('baz', FacadeStub::bar()); + } + + public function testFacadeResolvesAgainAfterClearingAll() + { + $app = new ApplicationStub; + $app->setAttributes(['foo' => $mock = m::mock(stdClass::class)]); + $mock->shouldReceive('bar')->times(2)->andReturn('baz'); + + // Resolve for the first time + FacadeStub::setFacadeApplication($app); + $this->assertSame('baz', FacadeStub::bar()); + + // Clear all resolved instances and resolve a second time + Facade::clearResolvedInstances(); + $this->assertSame('baz', FacadeStub::bar()); + } } class FacadeStub extends Facade diff --git a/tests/Support/SupportFacadesEventTest.php b/tests/Support/SupportFacadesEventTest.php index 928ce440e3f0..7ba8b8b40f29 100644 --- a/tests/Support/SupportFacadesEventTest.php +++ b/tests/Support/SupportFacadesEventTest.php @@ -40,8 +40,8 @@ protected function setUp(): void protected function tearDown(): void { - Event::clearResolvedInstances(); - Event::setFacadeApplication(null); + Facade::clearResolvedInstances(); + Facade::setFacadeApplication(null); m::close(); } diff --git a/tests/Support/SupportFacadesQueueTest.php b/tests/Support/SupportFacadesQueueTest.php index 96882c18a595..c26123d8f273 100644 --- a/tests/Support/SupportFacadesQueueTest.php +++ b/tests/Support/SupportFacadesQueueTest.php @@ -30,7 +30,7 @@ protected function setUp(): void protected function tearDown(): void { - Queue::clearResolvedInstances(); + Queue::clearResolvedInstance(); Queue::setFacadeApplication(null); m::close(); diff --git a/tests/Testing/Concerns/TestDatabasesTest.php b/tests/Testing/Concerns/TestDatabasesTest.php index e5e1f110d884..a9443eae9f31 100644 --- a/tests/Testing/Concerns/TestDatabasesTest.php +++ b/tests/Testing/Concerns/TestDatabasesTest.php @@ -101,7 +101,7 @@ protected function tearDown(): void parent::tearDown(); Container::setInstance(null); - DB::clearResolvedInstances(); + DB::clearResolvedInstance(); DB::setFacadeApplication(null); unset($_SERVER['LARAVEL_PARALLEL_TESTING']);