Skip to content

Commit 8be98db

Browse files
committed
Proxy the router cache warmer to the framework bundle
1 parent 5c14769 commit 8be98db

3 files changed

Lines changed: 51 additions & 62 deletions

File tree

config/services.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
use Ratchet\RFC6455\Handshake\ServerNegotiator;
5454
use React\EventLoop\Loop;
5555
use React\EventLoop\LoopInterface;
56+
use Symfony\Bundle\FrameworkBundle\CacheWarmer\RouterCacheWarmer as BaseRouterCacheWarmer;
5657
use Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand;
5758
use Symfony\Bundle\FrameworkBundle\Routing\Router;
5859
use Symfony\Component\Config\Loader\DelegatingLoader;
@@ -73,6 +74,8 @@
7374
use Symfony\Component\Routing\RequestContext;
7475

7576
return static function (ContainerConfigurator $container): void {
77+
$websocketRouterFolder = 'websocket-router';
78+
7679
$services = $container->services();
7780

7881
$services->set('babdev_websocket_server.authentication.authenticator', DefaultAuthenticator::class)
@@ -198,7 +201,7 @@
198201
service(PsrContainerInterface::class),
199202
abstract_arg('routing resource'),
200203
[
201-
'cache_dir' => param('kernel.cache_dir') . '/websocket-router',
204+
'cache_dir' => param('kernel.build_dir') . '/' . $websocketRouterFolder,
202205
'debug' => param('kernel.debug'),
203206
'generator_class' => CompiledUrlGenerator::class,
204207
'generator_dumper_class' => CompiledUrlGeneratorDumper::class,
@@ -217,12 +220,18 @@
217220
->tag('container.service_subscriber', ['key' => 'routing.loader', 'id' => 'babdev_websocket_server.routing.loader'])
218221
;
219222

220-
$services->set('babdev_websocket_server.router.cache_warmer', RouterCacheWarmer::class)
223+
$services->set('babdev_websocket_server.router.cache_warmer.inner', BaseRouterCacheWarmer::class)
221224
->args([
222225
service(PsrContainerInterface::class),
223-
param('kernel.cache_dir') . '/websocket-router',
224226
])
225-
->tag('container.service_subscriber', ['id' => 'babdev_websocket_server.router'])
227+
->tag('container.service_subscriber', ['key' => 'router', 'id' => 'babdev_websocket_server.router'])
228+
;
229+
230+
$services->set('babdev_websocket_server.router.cache_warmer', RouterCacheWarmer::class)
231+
->args([
232+
service('babdev_websocket_server.router.cache_warmer.inner'),
233+
$websocketRouterFolder,
234+
])
226235
->tag('kernel.cache_warmer')
227236
;
228237

src/CacheWarmer/RouterCacheWarmer.php

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,28 @@
22

33
namespace BabDev\WebSocketBundle\CacheWarmer;
44

5-
use Psr\Container\ContainerInterface;
65
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
7-
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
8-
use Symfony\Component\Routing\RouterInterface;
9-
use Symfony\Contracts\Service\ServiceSubscriberInterface;
106

117
/**
12-
* Generates the websocket router matcher and generator classes.
8+
* Decorator for the FrameworkBundle's router cache warmer to ensure the websocket router matcher and generator classes are generated in a unique cache path.
139
*/
14-
final readonly class RouterCacheWarmer implements CacheWarmerInterface, ServiceSubscriberInterface
10+
final readonly class RouterCacheWarmer implements CacheWarmerInterface
1511
{
1612
public function __construct(
17-
private ContainerInterface $container,
18-
private string $routerCacheDir,
13+
private CacheWarmerInterface $cacheWarmer,
14+
private string $websocketRouterFolder,
1915
) {}
2016

2117
public function warmUp(string $cacheDir, ?string $buildDir = null): array
2218
{
23-
$router = $this->container->get('babdev_websocket_server.router');
24-
25-
if ($router instanceof WarmableInterface) {
26-
return (array) $router->warmUp($this->routerCacheDir, $buildDir);
27-
}
28-
29-
throw new \LogicException(sprintf('The router "%s" cannot be warmed up because it does not implement "%s".', get_debug_type($router), WarmableInterface::class));
19+
return $this->cacheWarmer->warmUp(
20+
$cacheDir.'/'.ltrim($this->websocketRouterFolder, '/'),
21+
null === $buildDir ? null : $buildDir.'/'.ltrim($this->websocketRouterFolder, '/'),
22+
);
3023
}
3124

3225
public function isOptional(): bool
3326
{
3427
return true;
3528
}
36-
37-
public static function getSubscribedServices(): array
38-
{
39-
return [
40-
'babdev_websocket_server.router' => RouterInterface::class,
41-
];
42-
}
4329
}

tests/CacheWarmer/RouterCacheWarmerTest.php

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,60 +5,54 @@
55
use BabDev\WebSocketBundle\CacheWarmer\RouterCacheWarmer;
66
use PHPUnit\Framework\MockObject\MockObject;
77
use PHPUnit\Framework\TestCase;
8-
use Psr\Container\ContainerInterface;
9-
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
8+
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
109
use Symfony\Component\Routing\Generator\UrlGenerator;
1110
use Symfony\Component\Routing\Matcher\UrlMatcher;
12-
use Symfony\Component\Routing\RouterInterface;
1311

1412
final class RouterCacheWarmerTest extends TestCase
1513
{
16-
public function testWarmUpWithWarmableInterface(): void
14+
public function testWarmUpWithNoBuildDir(): void
1715
{
18-
$cachePath = '/tmp/cache';
16+
$cacheDir = '/tmp/cache';
17+
$cacheFolder = 'websocket-router';
1918

20-
/** @var MockObject&testRouterInterfaceWithWarmableInterface $router */
21-
$router = $this->createMock(testRouterInterfaceWithWarmableInterface::class);
19+
/** @var MockObject&CacheWarmerInterface $innerCacheWarmer */
20+
$innerCacheWarmer = $this->createMock(CacheWarmerInterface::class);
2221

23-
$router->expects(self::once())
22+
$innerCacheWarmer->expects(self::once())
2423
->method('warmUp')
25-
->with($cachePath)
26-
->willReturn(
27-
[
28-
UrlGenerator::class,
29-
UrlMatcher::class,
30-
]
31-
);
32-
33-
/** @var MockObject&ContainerInterface $container */
34-
$container = $this->createMock(ContainerInterface::class);
35-
$container->method('get')
36-
->with('babdev_websocket_server.router')
37-
->willReturn($router);
24+
->with(sprintf('%s/%s', $cacheDir, $cacheFolder), null)
25+
->willReturn([
26+
UrlGenerator::class,
27+
UrlMatcher::class,
28+
]);
3829

3930
self::assertSame([
4031
UrlGenerator::class,
4132
UrlMatcher::class,
42-
], (new RouterCacheWarmer($container, $cachePath))->warmUp('/tmp'));
33+
], (new RouterCacheWarmer($innerCacheWarmer, $cacheFolder))->warmUp($cacheDir, null));
4334
}
4435

45-
public function testWarmUpWithoutWarmableInterface(): void
36+
public function testWarmUpWithBuildDir(): void
4637
{
47-
$this->expectException(\LogicException::class);
38+
$buildDir = '/tmp/build';
39+
$cacheDir = '/tmp/cache';
40+
$cacheFolder = 'websocket-router';
4841

49-
/** @var MockObject&testRouterInterfaceWithoutWarmableInterface $router */
50-
$router = $this->createMock(testRouterInterfaceWithoutWarmableInterface::class);
42+
/** @var MockObject&CacheWarmerInterface $innerCacheWarmer */
43+
$innerCacheWarmer = $this->createMock(CacheWarmerInterface::class);
5144

52-
/** @var MockObject&ContainerInterface $container */
53-
$container = $this->createMock(ContainerInterface::class);
54-
$container->method('get')
55-
->with('babdev_websocket_server.router')
56-
->willReturn($router);
45+
$innerCacheWarmer->expects(self::once())
46+
->method('warmUp')
47+
->with(sprintf('%s/%s', $cacheDir, $cacheFolder), sprintf('%s/%s', $buildDir, $cacheFolder))
48+
->willReturn([
49+
UrlGenerator::class,
50+
UrlMatcher::class,
51+
]);
5752

58-
(new RouterCacheWarmer($container, '/tmp/cache'))->warmUp('/tmp');
53+
self::assertSame([
54+
UrlGenerator::class,
55+
UrlMatcher::class,
56+
], (new RouterCacheWarmer($innerCacheWarmer, $cacheFolder))->warmUp($cacheDir, $buildDir));
5957
}
6058
}
61-
62-
interface testRouterInterfaceWithWarmableInterface extends RouterInterface, WarmableInterface {}
63-
64-
interface testRouterInterfaceWithoutWarmableInterface extends RouterInterface {}

0 commit comments

Comments
 (0)