From aa786c0df54c0f968f5dfff61487bd1f20a5697c Mon Sep 17 00:00:00 2001 From: Choraimy Kroonstuiver <3661474+axlon@users.noreply.github.com> Date: Sat, 18 Dec 2021 19:58:09 +0100 Subject: [PATCH 1/4] Add cache based maintenance mode support --- .../Foundation/CacheBasedMaintenanceMode.php | 97 +++++++++++++++++++ .../Providers/FoundationServiceProvider.php | 13 ++- ...oundationCacheBasedMaintenanceModeTest.php | 62 ++++++++++++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/Illuminate/Foundation/CacheBasedMaintenanceMode.php create mode 100644 tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php diff --git a/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php new file mode 100644 index 000000000000..9d9cb3c766d7 --- /dev/null +++ b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php @@ -0,0 +1,97 @@ +cache = $cache; + $this->store = $store; + $this->key = $key; + } + + /** + * Take the application down for maintenance. + * + * @param array $payload + * @return void + */ + public function activate(array $payload): void + { + $this->getStore()->put($this->key, $payload); + } + + /** + * Take the application out of maintenance. + * + * @return void + */ + public function deactivate(): void + { + $this->getStore()->forget($this->key); + } + + /** + * Determine if the application is currently down for maintenance. + * + * @return bool + */ + public function active(): bool + { + return $this->getStore()->has($this->key); + } + + /** + * Get the data array which was provided when the application was placed into maintenance. + * + * @return array + */ + public function data(): array + { + return $this->getStore()->get($this->key); + } + + /** + * Get the cache store to use. + * + * @return \Illuminate\Contracts\Cache\Repository + */ + protected function getStore(): Repository + { + return $this->cache->store($this->store); + } +} diff --git a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php index c0b5ca1eb836..c7b6fcce8d5f 100644 --- a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php @@ -3,6 +3,7 @@ namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Foundation\MaintenanceMode as MaintenanceModeContract; +use Illuminate\Foundation\CacheBasedMaintenanceMode; use Illuminate\Foundation\FileBasedMaintenanceMode; use Illuminate\Http\Request; use Illuminate\Log\Events\MessageLogged; @@ -128,6 +129,16 @@ protected function registerExceptionTracking() */ public function registerMaintenanceModeManager() { - $this->app->bind(MaintenanceModeContract::class, FileBasedMaintenanceMode::class); + $this->app->bind(MaintenanceModeContract::class, function () { + $driver = config('app.maintenance_mode', 'filesystem'); + + if ($driver === 'cache') { + return new CacheBasedMaintenanceMode( + $this->app->make('cache'), config('cache.default'), 'illuminate:foundation:down', + ); + } + + return new FileBasedMaintenanceMode(); + }); } } diff --git a/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php b/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php new file mode 100644 index 000000000000..a528948377d5 --- /dev/null +++ b/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php @@ -0,0 +1,62 @@ +shouldReceive('store')->with('store-key')->andReturnSelf(); + + $manager = new CacheBasedMaintenanceMode($cache, 'store-key', 'key'); + + $cache->shouldReceive('has')->once()->with('key')->andReturnFalse(); + $this->assertFalse($manager->active()); + + $cache->shouldReceive('has')->once()->with('key')->andReturnTrue(); + $this->assertTrue($manager->active()); + } + + public function test_it_retrieves_payload_from_cache() + { + $cache = m::mock(Factory::class, Repository::class); + $cache->shouldReceive('store')->with('store-key')->andReturnSelf(); + + $manager = new CacheBasedMaintenanceMode($cache, 'store-key', 'key'); + + $cache->shouldReceive('get')->once()->with('key')->andReturn(['payload']); + $this->assertSame(['payload'], $manager->data()); + } + + public function test_it_stores_payload_in_cache() + { + $cache = m::spy(Factory::class, Repository::class); + $cache->shouldReceive('store')->with('store-key')->andReturnSelf(); + + $manager = new CacheBasedMaintenanceMode($cache, 'store-key', 'key'); + $manager->activate(['payload']); + + $cache->shouldHaveReceived('put')->once()->with('key', ['payload']); + } + + public function test_it_removes_payload_from_cache() + { + $cache = m::spy(Factory::class, Repository::class); + $cache->shouldReceive('store')->with('store-key')->andReturnSelf(); + + $manager = new CacheBasedMaintenanceMode($cache, 'store-key', 'key'); + $manager->deactivate(); + + $cache->shouldHaveReceived('forget')->once()->with('key'); + } +} From 6039b368de818ac9c2b8f79ad235bc0ebcb102e1 Mon Sep 17 00:00:00 2001 From: Choraimy Kroonstuiver <3661474+axlon@users.noreply.github.com> Date: Sat, 18 Dec 2021 20:26:14 +0100 Subject: [PATCH 2/4] Add a maintenance mode driver manager --- .../Foundation/MaintenanceModeManager.php | 43 +++++++++++++++++++ .../Providers/FoundationServiceProvider.php | 16 ++----- 2 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 src/Illuminate/Foundation/MaintenanceModeManager.php diff --git a/src/Illuminate/Foundation/MaintenanceModeManager.php b/src/Illuminate/Foundation/MaintenanceModeManager.php new file mode 100644 index 000000000000..73cc1da5829f --- /dev/null +++ b/src/Illuminate/Foundation/MaintenanceModeManager.php @@ -0,0 +1,43 @@ +config->get('app.maintenance.driver', 'file'); + } + + /** + * Create an instance of the cache maintenance driver. + * + * @return \Illuminate\Foundation\CacheBasedMaintenanceMode + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function createCacheDriver(): CacheBasedMaintenanceMode + { + $cache = $this->container->make('cache'); + $store = $this->config->get('app.maintenance.store') ?: $this->config->get('cache.default'); + $key = 'illuminate:foundation:down'; + + return new CacheBasedMaintenanceMode($cache, $store, $key); + } + + /** + * Create an instance of the file maintenance driver. + * + * @return \Illuminate\Foundation\FileBasedMaintenanceMode + */ + protected function createFileDriver(): FileBasedMaintenanceMode + { + return new FileBasedMaintenanceMode(); + } +} diff --git a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php index c7b6fcce8d5f..42f6add68bfe 100644 --- a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php @@ -3,8 +3,7 @@ namespace Illuminate\Foundation\Providers; use Illuminate\Contracts\Foundation\MaintenanceMode as MaintenanceModeContract; -use Illuminate\Foundation\CacheBasedMaintenanceMode; -use Illuminate\Foundation\FileBasedMaintenanceMode; +use Illuminate\Foundation\MaintenanceModeManager; use Illuminate\Http\Request; use Illuminate\Log\Events\MessageLogged; use Illuminate\Support\AggregateServiceProvider; @@ -129,16 +128,7 @@ protected function registerExceptionTracking() */ public function registerMaintenanceModeManager() { - $this->app->bind(MaintenanceModeContract::class, function () { - $driver = config('app.maintenance_mode', 'filesystem'); - - if ($driver === 'cache') { - return new CacheBasedMaintenanceMode( - $this->app->make('cache'), config('cache.default'), 'illuminate:foundation:down', - ); - } - - return new FileBasedMaintenanceMode(); - }); + $this->app->singleton('maintenance', MaintenanceModeManager::class); + $this->app->bind(MaintenanceModeContract::class, fn () => $this->app->make('maintenance')->driver()); } } From 140b1899d268a3c5d4de67656be1dcf117ff7da9 Mon Sep 17 00:00:00 2001 From: Choraimy Kroonstuiver <3661474+axlon@users.noreply.github.com> Date: Sat, 18 Dec 2021 20:28:27 +0100 Subject: [PATCH 3/4] Fix code style --- src/Illuminate/Foundation/CacheBasedMaintenanceMode.php | 8 ++++---- src/Illuminate/Foundation/MaintenanceModeManager.php | 1 + .../FoundationCacheBasedMaintenanceModeTest.php | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php index 9d9cb3c766d7..9bfac6d0571f 100644 --- a/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php +++ b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php @@ -32,9 +32,9 @@ class CacheBasedMaintenanceMode implements MaintenanceMode /** * Create a new cache-based maintenance mode manager. * - * @param \Illuminate\Contracts\Cache\Factory $cache - * @param string $store - * @param string $key + * @param \Illuminate\Contracts\Cache\Factory $cache + * @param string $store + * @param string $key * @return void */ public function __construct(Factory $cache, string $store, string $key) @@ -47,7 +47,7 @@ public function __construct(Factory $cache, string $store, string $key) /** * Take the application down for maintenance. * - * @param array $payload + * @param array $payload * @return void */ public function activate(array $payload): void diff --git a/src/Illuminate/Foundation/MaintenanceModeManager.php b/src/Illuminate/Foundation/MaintenanceModeManager.php index 73cc1da5829f..b0cab3bc62d4 100644 --- a/src/Illuminate/Foundation/MaintenanceModeManager.php +++ b/src/Illuminate/Foundation/MaintenanceModeManager.php @@ -20,6 +20,7 @@ public function getDefaultDriver(): string * Create an instance of the cache maintenance driver. * * @return \Illuminate\Foundation\CacheBasedMaintenanceMode + * * @throws \Illuminate\Contracts\Container\BindingResolutionException */ protected function createCacheDriver(): CacheBasedMaintenanceMode diff --git a/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php b/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php index a528948377d5..19d41cf0aca3 100644 --- a/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php +++ b/tests/Foundation/FoundationCacheBasedMaintenanceModeTest.php @@ -5,8 +5,8 @@ use Illuminate\Contracts\Cache\Factory; use Illuminate\Contracts\Cache\Repository; use Illuminate\Foundation\CacheBasedMaintenanceMode; -use Mockery as m; use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; +use Mockery as m; use PHPUnit\Framework\TestCase; class FoundationCacheBasedMaintenanceModeTest extends TestCase From 45255b31515246f60171f8334bb33a425f170ee3 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 21 Dec 2021 16:38:37 -0600 Subject: [PATCH 4/4] formatting --- .../Foundation/CacheBasedMaintenanceMode.php | 6 ++-- .../Foundation/MaintenanceModeManager.php | 28 +++++++++---------- .../Providers/FoundationServiceProvider.php | 8 ++++-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php index 9bfac6d0571f..01ff30d4b6a4 100644 --- a/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php +++ b/src/Illuminate/Foundation/CacheBasedMaintenanceMode.php @@ -16,21 +16,21 @@ class CacheBasedMaintenanceMode implements MaintenanceMode protected $cache; /** - * The cache store to use. + * The cache store that should be utilized. * * @var string */ protected $store; /** - * The cache key to use. + * The cache key to use when storing maintenance mode information. * * @var string */ protected $key; /** - * Create a new cache-based maintenance mode manager. + * Create a new cache based maintenance mode implementation. * * @param \Illuminate\Contracts\Cache\Factory $cache * @param string $store diff --git a/src/Illuminate/Foundation/MaintenanceModeManager.php b/src/Illuminate/Foundation/MaintenanceModeManager.php index b0cab3bc62d4..4d233f44f3e3 100644 --- a/src/Illuminate/Foundation/MaintenanceModeManager.php +++ b/src/Illuminate/Foundation/MaintenanceModeManager.php @@ -7,17 +7,17 @@ class MaintenanceModeManager extends Manager { /** - * Get the default driver name. + * Create an instance of the file based maintenance driver. * - * @return string + * @return \Illuminate\Foundation\FileBasedMaintenanceMode */ - public function getDefaultDriver(): string + protected function createFileDriver(): FileBasedMaintenanceMode { - return $this->config->get('app.maintenance.driver', 'file'); + return new FileBasedMaintenanceMode(); } /** - * Create an instance of the cache maintenance driver. + * Create an instance of the cache based maintenance driver. * * @return \Illuminate\Foundation\CacheBasedMaintenanceMode * @@ -25,20 +25,20 @@ public function getDefaultDriver(): string */ protected function createCacheDriver(): CacheBasedMaintenanceMode { - $cache = $this->container->make('cache'); - $store = $this->config->get('app.maintenance.store') ?: $this->config->get('cache.default'); - $key = 'illuminate:foundation:down'; - - return new CacheBasedMaintenanceMode($cache, $store, $key); + return new CacheBasedMaintenanceMode( + $this->container->make('cache'), + $this->config->get('app.maintenance.store') ?: $this->config->get('cache.default'), + 'illuminate:foundation:down' + ); } /** - * Create an instance of the file maintenance driver. + * Get the default driver name. * - * @return \Illuminate\Foundation\FileBasedMaintenanceMode + * @return string */ - protected function createFileDriver(): FileBasedMaintenanceMode + public function getDefaultDriver(): string { - return new FileBasedMaintenanceMode(); + return $this->config->get('app.maintenance.driver', 'file'); } } diff --git a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php index 42f6add68bfe..2deea7af44bf 100644 --- a/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php +++ b/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php @@ -128,7 +128,11 @@ protected function registerExceptionTracking() */ public function registerMaintenanceModeManager() { - $this->app->singleton('maintenance', MaintenanceModeManager::class); - $this->app->bind(MaintenanceModeContract::class, fn () => $this->app->make('maintenance')->driver()); + $this->app->singleton(MaintenanceModeManager::class); + + $this->app->bind( + MaintenanceModeContract::class, + fn () => $this->app->make(MaintenanceModeManager::class)->driver() + ); } }