Skip to content

Commit 7a55d3e

Browse files
authored
[12.x] Simplify clearing resolved instances for Facade classes (#58072)
* Allow easily clearing resolved Facade instance through child class * Add tests for clearing resolved facade instances * Use new Facade clearResolvedInstance syntax in existing code
1 parent cf4b36c commit 7a55d3e

File tree

7 files changed

+45
-11
lines changed

7 files changed

+45
-11
lines changed

src/Illuminate/Foundation/Http/Kernel.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use Illuminate\Routing\Pipeline;
1313
use Illuminate\Routing\Router;
1414
use Illuminate\Support\Carbon;
15-
use Illuminate\Support\Facades\Facade;
15+
use Illuminate\Support\Facades\Request;
1616
use Illuminate\Support\InteractsWithTime;
1717
use InvalidArgumentException;
1818
use Throwable;
@@ -165,7 +165,7 @@ protected function sendRequestThroughRouter($request)
165165
{
166166
$this->app->instance('request', $request);
167167

168-
Facade::clearResolvedInstance('request');
168+
Request::clearResolvedInstance();
169169

170170
$this->bootstrap();
171171

src/Illuminate/Foundation/Testing/Concerns/InteractsWithContainer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Illuminate\Foundation\Mix;
77
use Illuminate\Foundation\Vite;
88
use Illuminate\Support\Defer\DeferredCallbackCollection;
9-
use Illuminate\Support\Facades\Facade;
9+
use Illuminate\Support\Facades\Vite as ViteFacade;
1010
use Illuminate\Support\HtmlString;
1111
use Mockery;
1212

@@ -123,7 +123,7 @@ protected function withoutVite()
123123
$this->originalVite = app(Vite::class);
124124
}
125125

126-
Facade::clearResolvedInstance(Vite::class);
126+
ViteFacade::clearResolvedInstance();
127127

128128
$this->swap(Vite::class, new class extends Vite
129129
{

src/Illuminate/Support/Facades/Facade.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,12 @@ protected static function resolveFacadeInstance($name)
247247
/**
248248
* Clear a resolved facade instance.
249249
*
250-
* @param string $name
250+
* @param ?string $name
251251
* @return void
252252
*/
253-
public static function clearResolvedInstance($name)
253+
public static function clearResolvedInstance($name = null)
254254
{
255-
unset(static::$resolvedInstance[$name]);
255+
unset(static::$resolvedInstance[$name ?? static::getFacadeAccessor()]);
256256
}
257257

258258
/**

tests/Support/SupportFacadeTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,40 @@ public function testExpectsReturnsAMockeryMockWithExpectationRequired()
8080
$this->assertInstanceOf(MockInterface::class, $mock = FacadeStub::expects('foo')->with('bar')->andReturn('baz')->getMock());
8181
$this->assertSame('baz', $app['foo']->foo('bar'));
8282
}
83+
84+
public function testFacadeResolvesAgainAfterClearingSpecific()
85+
{
86+
$app = new ApplicationStub;
87+
$app->setAttributes(['foo' => $mock = m::mock(stdClass::class)]);
88+
$mock->shouldReceive('bar')->times(3)->andReturn('baz');
89+
90+
// Resolve for the first time
91+
FacadeStub::setFacadeApplication($app);
92+
$this->assertSame('baz', FacadeStub::bar());
93+
94+
// Clear resolved instance and resolve the second time
95+
FacadeStub::clearResolvedInstance();
96+
$this->assertSame('baz', FacadeStub::bar());
97+
98+
// Clear resolved instance through parent and resolve the third time
99+
Facade::clearResolvedInstance('foo');
100+
$this->assertSame('baz', FacadeStub::bar());
101+
}
102+
103+
public function testFacadeResolvesAgainAfterClearingAll()
104+
{
105+
$app = new ApplicationStub;
106+
$app->setAttributes(['foo' => $mock = m::mock(stdClass::class)]);
107+
$mock->shouldReceive('bar')->times(2)->andReturn('baz');
108+
109+
// Resolve for the first time
110+
FacadeStub::setFacadeApplication($app);
111+
$this->assertSame('baz', FacadeStub::bar());
112+
113+
// Clear all resolved instances and resolve a second time
114+
Facade::clearResolvedInstances();
115+
$this->assertSame('baz', FacadeStub::bar());
116+
}
83117
}
84118

85119
class FacadeStub extends Facade

tests/Support/SupportFacadesEventTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ protected function setUp(): void
4040

4141
protected function tearDown(): void
4242
{
43-
Event::clearResolvedInstances();
44-
Event::setFacadeApplication(null);
43+
Facade::clearResolvedInstances();
44+
Facade::setFacadeApplication(null);
4545

4646
m::close();
4747
}

tests/Support/SupportFacadesQueueTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ protected function setUp(): void
3030

3131
protected function tearDown(): void
3232
{
33-
Queue::clearResolvedInstances();
33+
Queue::clearResolvedInstance();
3434
Queue::setFacadeApplication(null);
3535

3636
m::close();

tests/Testing/Concerns/TestDatabasesTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ protected function tearDown(): void
101101
parent::tearDown();
102102

103103
Container::setInstance(null);
104-
DB::clearResolvedInstances();
104+
DB::clearResolvedInstance();
105105
DB::setFacadeApplication(null);
106106

107107
unset($_SERVER['LARAVEL_PARALLEL_TESTING']);

0 commit comments

Comments
 (0)