From db60d1fd87131f860672f8d11fd605bcb658652a Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 9 Aug 2021 12:33:25 +0200 Subject: [PATCH] [Cache] fix wiring async cache recomputing in debug mode --- .../Cache/DependencyInjection/CacheCollectorPass.php | 9 +++++++++ .../DependencyInjection/CacheCollectorPassTest.php | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php b/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php index 0bc7bc78e0ca7..843232e441530 100644 --- a/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php +++ b/src/Symfony/Component/Cache/DependencyInjection/CacheCollectorPass.php @@ -72,6 +72,15 @@ private function addToCollector(string $id, string $name, ContainerBuilder $cont } $recorder->setArguments([new Reference($innerId = $id.$this->cachePoolRecorderInnerSuffix)]); + foreach ($definition->getMethodCalls() as [$method, $args]) { + if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { + continue; + } + if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) { + $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']); + } + } + $definition->setTags([]); $definition->setPublic(false); diff --git a/src/Symfony/Component/Cache/Tests/DependencyInjection/CacheCollectorPassTest.php b/src/Symfony/Component/Cache/Tests/DependencyInjection/CacheCollectorPassTest.php index d0ea55313b885..8ea6950429faa 100644 --- a/src/Symfony/Component/Cache/Tests/DependencyInjection/CacheCollectorPassTest.php +++ b/src/Symfony/Component/Cache/Tests/DependencyInjection/CacheCollectorPassTest.php @@ -22,6 +22,7 @@ use Symfony\Component\Cache\Tests\Fixtures\ArrayCache; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; class CacheCollectorPassTest extends TestCase @@ -31,6 +32,13 @@ public function testProcess() $container = new ContainerBuilder(); $container ->register('fs', FilesystemAdapter::class) + ->addMethodCall('setCallbackWrapper', [(new Definition()) + ->addArgument(null) + ->addArgument(null) + ->addArgument((new Definition('callable')) + ->setFactory([new Reference('fs'), 'setCallbackWrapper']) + ), + ]) ->addTag('cache.pool'); $container ->register('tagged_fs', TagAwareAdapter::class) @@ -60,6 +68,9 @@ public function testProcess() $this->assertSame(TagAwareAdapter::class, $container->getDefinition('php')->getClass()); $this->assertFalse($collector->isPublic(), 'The "data_collector.cache" should be private after processing'); + + $innerFs = $container->getDefinition('fs.recorder_inner'); + $this->assertEquals([new Reference('fs.recorder_inner'), 'setCallbackWrapper'], $innerFs->getMethodCalls()[0][1][0]->getArgument(2)->getFactory()); } public function testProcessCacheObjectsAreDecorated()