Skip to content

Commit 52909f2

Browse files
authored
Merge pull request #5 from CakeDC/feature/4
Feature/4
2 parents 1455fc5 + 2184d86 commit 52909f2

File tree

5 files changed

+56
-8
lines changed

5 files changed

+56
-8
lines changed

.github/workflows/ci.yml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,26 @@ jobs:
1818
secrets: inherit
1919

2020
cs-stan:
21-
uses: cakephp/.github/.github/workflows/[email protected]
22-
secrets: inherit
21+
runs-on: ubuntu-latest
22+
steps:
23+
- uses: actions/checkout@v4
24+
25+
- name: Setup PHP
26+
uses: shivammathur/setup-php@v2
27+
with:
28+
php-version: '8.3'
29+
extensions: mbstring, intl
30+
coverage: none
31+
tools: composer:v2
32+
33+
- name: Composer install
34+
run: |
35+
composer install --no-progress --prefer-dist --optimize-autoloader
36+
37+
- name: Install PHPStan
38+
run: |
39+
composer require --dev phpstan/phpstan
40+
41+
- name: Run phpstan
42+
run: |
43+
vendor/bin/phpstan analyse --error-format=github --configuration=phpstan.neon

composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
},
3131
"require-dev": {
3232
"phpunit/phpunit": "^10.1.0",
33-
"cakephp/cakephp-codesniffer": "^5.0",
34-
"vimeo/psalm": "^5.15"
33+
"cakephp/cakephp-codesniffer": "^5.0"
3534
},
3635
"autoload": {
3736
"psr-4": {

phpstan.neon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ includes:
33

44
parameters:
55
level: 8
6-
checkMissingIterableValueType: false
7-
checkGenericClassInNonGenericObjectType: false
86
treatPhpDocTypesAsCertain: false
97
paths:
108
- src/

src/Routing/Middleware/CachedRoutingMiddleware.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,14 @@ protected function buildRouteCollection(): RouteCollection
7575
{
7676
if (Cache::enabled() && $this->cacheConfig !== null) {
7777
try {
78-
return Cache::remember(static::ROUTE_COLLECTION_CACHE_KEY, function () {
78+
$cached = Cache::remember(static::ROUTE_COLLECTION_CACHE_KEY, function () {
7979
return $this->prepareRouteCollection();
8080
}, $this->cacheConfig);
81+
if ($cached instanceof RouteCollection) {
82+
return $cached;
83+
} else {
84+
Cache::delete(static::ROUTE_COLLECTION_CACHE_KEY, $this->cacheConfig);
85+
}
8186
} catch (InvalidArgumentException $e) {
8287
throw $e;
8388
} catch (Exception $e) {
@@ -86,7 +91,7 @@ protected function buildRouteCollection(): RouteCollection
8691
middleware or other unserializable settings in your routes. The original exception message can
8792
show what type of object failed to serialize.',
8893
null,
89-
$e
94+
$e,
9095
);
9196
}
9297
}

tests/TestCase/Routing/Middleware/CachedRoutingMiddlewareTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
namespace CakeDC\CachedRouting\Test\TestCase\Routing\Middleware;
1515

1616
use Cake\Cache\Cache;
17+
use Cake\Http\Response;
1718
use Cake\Http\ServerRequestFactory;
1819
use Cake\Routing\RouteBuilder;
1920
use Cake\Routing\RouteCollection;
21+
use Cake\Routing\Router;
2022
use Cake\TestSuite\TestCase;
2123
use CakeDC\CachedRouting\Routing\Exception\FailedRouteCacheException;
2224
use CakeDC\CachedRouting\Routing\Middleware\CachedRoutingMiddleware;
@@ -76,4 +78,27 @@ public function testFailedRouteCache(): void
7678
$this->expectExceptionMessage('Unable to cache route collection.');
7779
$middleware->process($request, new TestRequestHandler());
7880
}
81+
82+
/**
83+
* Test that when cache returns a non-RouteCollection value, it gets deleted and a new RouteCollection is created.
84+
*/
85+
public function testInvalidCachedValue(): void
86+
{
87+
$cacheConfigName = '_cake_router_';
88+
Cache::setConfig($cacheConfigName, [
89+
'engine' => 'File',
90+
'path' => CACHE,
91+
]);
92+
93+
Cache::write(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, 'not a route collection', $cacheConfigName);
94+
$this->assertEquals('not a route collection', Cache::read(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, $cacheConfigName));
95+
96+
$request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']);
97+
$middleware = new CachedRoutingMiddleware(new Application(), $cacheConfigName);
98+
$response = $middleware->process($request, new TestRequestHandler());
99+
100+
$this->assertInstanceOf(Response::class, $response);
101+
$this->assertNull(Cache::read(CachedRoutingMiddleware::ROUTE_COLLECTION_CACHE_KEY, $cacheConfigName));
102+
$this->assertInstanceOf(RouteCollection::class, Router::getRouteCollection());
103+
}
79104
}

0 commit comments

Comments
 (0)