From c91ddbf0efb2a1a9a3dac1b09c7811e7e0fd17df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:38:51 +0100 Subject: [PATCH 1/6] #4 ensure the return type is a RouteCollection --- .../Middleware/CachedRoutingMiddleware.php | 7 +++++- .../CachedRoutingMiddlewareTest.php | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/Routing/Middleware/CachedRoutingMiddleware.php b/src/Routing/Middleware/CachedRoutingMiddleware.php index 6a1b5a1..f3ca948 100644 --- a/src/Routing/Middleware/CachedRoutingMiddleware.php +++ b/src/Routing/Middleware/CachedRoutingMiddleware.php @@ -75,9 +75,14 @@ protected function buildRouteCollection(): RouteCollection { if (Cache::enabled() && $this->cacheConfig !== null) { try { - return Cache::remember(static::ROUTE_COLLECTION_CACHE_KEY, function () { + $cached = Cache::remember(static::ROUTE_COLLECTION_CACHE_KEY, function () { return $this->prepareRouteCollection(); }, $this->cacheConfig); + if ($cached instanceof RouteCollection) { + return $cached; + } else { + Cache::delete(static::ROUTE_COLLECTION_CACHE_KEY, $this->cacheConfig); + } } catch (InvalidArgumentException $e) { throw $e; } catch (Exception $e) { diff --git a/tests/TestCase/Routing/Middleware/CachedRoutingMiddlewareTest.php b/tests/TestCase/Routing/Middleware/CachedRoutingMiddlewareTest.php index b813832..65d0b9f 100644 --- a/tests/TestCase/Routing/Middleware/CachedRoutingMiddlewareTest.php +++ b/tests/TestCase/Routing/Middleware/CachedRoutingMiddlewareTest.php @@ -14,9 +14,11 @@ namespace CakeDC\CachedRouting\Test\TestCase\Routing\Middleware; use Cake\Cache\Cache; +use Cake\Http\Response; use Cake\Http\ServerRequestFactory; use Cake\Routing\RouteBuilder; use Cake\Routing\RouteCollection; +use Cake\Routing\Router; use Cake\TestSuite\TestCase; use CakeDC\CachedRouting\Routing\Exception\FailedRouteCacheException; use CakeDC\CachedRouting\Routing\Middleware\CachedRoutingMiddleware; @@ -76,4 +78,27 @@ public function testFailedRouteCache(): void $this->expectExceptionMessage('Unable to cache route collection.'); $middleware->process($request, new TestRequestHandler()); } + + /** + * Test that when cache returns a non-RouteCollection value, it gets deleted and a new RouteCollection is created. + */ + public function testInvalidCachedValue(): void + { + $cacheConfigName = '_cake_router_'; + Cache::setConfig($cacheConfigName, [ + 'engine' => 'File', + 'path' => CACHE, + ]); + + Cache::write(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, 'not a route collection', $cacheConfigName); + $this->assertEquals('not a route collection', Cache::read(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, $cacheConfigName)); + + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']); + $middleware = new CachedRoutingMiddleware(new Application(), $cacheConfigName); + $response = $middleware->process($request, new TestRequestHandler()); + + $this->assertInstanceOf(Response::class, $response); + $this->assertNull(Cache::read(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, $cacheConfigName)); + $this->assertInstanceOf(RouteCollection::class, Router::getRouteCollection()); + } } From 98355ed29af2d6695560f93588492ea8c9dc71e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:38:51 +0100 Subject: [PATCH 2/6] fix cs --- src/Routing/Middleware/CachedRoutingMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Routing/Middleware/CachedRoutingMiddleware.php b/src/Routing/Middleware/CachedRoutingMiddleware.php index f3ca948..6a3b07c 100644 --- a/src/Routing/Middleware/CachedRoutingMiddleware.php +++ b/src/Routing/Middleware/CachedRoutingMiddleware.php @@ -91,7 +91,7 @@ protected function buildRouteCollection(): RouteCollection middleware or other unserializable settings in your routes. The original exception message can show what type of object failed to serialize.', null, - $e + $e, ); } } From 2ee8bfe45bc82725447cf9c8959e6bf6f3dcd7f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:42:06 +0100 Subject: [PATCH 3/6] #4 remove psalm requirement --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6ad2f87..523a7aa 100644 --- a/composer.json +++ b/composer.json @@ -30,8 +30,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.1.0", - "cakephp/cakephp-codesniffer": "^5.0", - "vimeo/psalm": "^5.15" + "cakephp/cakephp-codesniffer": "^5.0" }, "autoload": { "psr-4": { From fa91b17e6b901860090ea1f2c6da6fcb4f907e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:49:37 +0100 Subject: [PATCH 4/6] #4 fix stan in pipeline --- .github/workflows/ci.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 439fde2..f44b0eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,5 +18,26 @@ jobs: secrets: inherit cs-stan: - uses: cakephp/.github/.github/workflows/cs-stan.yml@5.x - secrets: inherit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.3' + extensions: mbstring, intl + coverage: none + tools: composer:v2 + + - name: Composer install + run: | + composer install --no-progress --prefer-dist --optimize-autoloader + + - name: Install PHPStan + run: | + composer require --dev phpstan/phpstan + + - name: Run phpstan + run: | + vendor/bin/phpstan analyse --error-format=github --configuration=phpstan.neon From 2b2340be7c7a4a2205c57a6f330b5a4134b73381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:52:08 +0100 Subject: [PATCH 5/6] #4 fix stan --- composer.json | 3 ++- phpstan.neon | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 523a7aa..5305457 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ }, "require-dev": { "phpunit/phpunit": "^10.1.0", - "cakephp/cakephp-codesniffer": "^5.0" + "cakephp/cakephp-codesniffer": "^5.0", + "phpstan/phpstan": "^2.1" }, "autoload": { "psr-4": { diff --git a/phpstan.neon b/phpstan.neon index c538d25..59f7883 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,8 +3,6 @@ includes: parameters: level: 8 - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false treatPhpDocTypesAsCertain: false paths: - src/ From 2184d861f8d521371077488193b3700cdeb65f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Gonz=C3=A1lez?= Date: Mon, 23 Jun 2025 19:52:48 +0100 Subject: [PATCH 6/6] #4 fix stan --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5305457..523a7aa 100644 --- a/composer.json +++ b/composer.json @@ -30,8 +30,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.1.0", - "cakephp/cakephp-codesniffer": "^5.0", - "phpstan/phpstan": "^2.1" + "cakephp/cakephp-codesniffer": "^5.0" }, "autoload": { "psr-4": {