bug #22960 [Cache] Fix decoration of TagAware adapters in dev (chalasr)
This PR was merged into the 3.3 branch.
Discussion
----------
[Cache] Fix decoration of TagAware adapters in dev
| Q | A
| ------------- | ---
| Branch? | 3.3
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #22956
| License | MIT
| Doc PR | n/a
Commits
-------
28e615a
Fix decorating TagAware adapters in dev
This commit is contained in:
commit
7587213ef5
@ -11,7 +11,9 @@
|
|||||||
|
|
||||||
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
|
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
|
||||||
|
|
||||||
|
use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
|
||||||
use Symfony\Component\Cache\Adapter\TraceableAdapter;
|
use Symfony\Component\Cache\Adapter\TraceableAdapter;
|
||||||
|
use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter;
|
||||||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
use Symfony\Component\DependencyInjection\Reference;
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
@ -34,11 +36,12 @@ class CacheCollectorPass implements CompilerPassInterface
|
|||||||
|
|
||||||
$collectorDefinition = $container->getDefinition('data_collector.cache');
|
$collectorDefinition = $container->getDefinition('data_collector.cache');
|
||||||
foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) {
|
foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) {
|
||||||
if ($container->getDefinition($id)->isAbstract()) {
|
$definition = $container->getDefinition($id);
|
||||||
|
if ($definition->isAbstract()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$container->register($id.'.recorder', TraceableAdapter::class)
|
$container->register($id.'.recorder', is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class)
|
||||||
->setDecoratedService($id)
|
->setDecoratedService($id)
|
||||||
->addArgument(new Reference($id.'.recorder.inner'))
|
->addArgument(new Reference($id.'.recorder.inner'))
|
||||||
->setPublic(false);
|
->setPublic(false);
|
||||||
|
@ -22,7 +22,7 @@ use Psr\Cache\CacheItemInterface;
|
|||||||
*/
|
*/
|
||||||
class TraceableAdapter implements AdapterInterface
|
class TraceableAdapter implements AdapterInterface
|
||||||
{
|
{
|
||||||
private $pool;
|
protected $pool;
|
||||||
private $calls = array();
|
private $calls = array();
|
||||||
|
|
||||||
public function __construct(AdapterInterface $pool)
|
public function __construct(AdapterInterface $pool)
|
||||||
@ -177,7 +177,7 @@ class TraceableAdapter implements AdapterInterface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function start($name)
|
protected function start($name)
|
||||||
{
|
{
|
||||||
$this->calls[] = $event = new TraceableAdapterEvent();
|
$this->calls[] = $event = new TraceableAdapterEvent();
|
||||||
$event->name = $name;
|
$event->name = $name;
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Cache\Adapter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robin Chalas <robin.chalas@gmail.com>
|
||||||
|
*/
|
||||||
|
class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface
|
||||||
|
{
|
||||||
|
public function __construct(TagAwareAdapterInterface $pool)
|
||||||
|
{
|
||||||
|
parent::__construct($pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function invalidateTags(array $tags)
|
||||||
|
{
|
||||||
|
$event = $this->start(__FUNCTION__);
|
||||||
|
try {
|
||||||
|
return $event->result = $this->pool->invalidateTags($tags);
|
||||||
|
} finally {
|
||||||
|
$event->end = microtime(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Cache\Tests\Adapter;
|
||||||
|
|
||||||
|
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
|
||||||
|
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
|
||||||
|
use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter;
|
||||||
|
|
||||||
|
class TraceableTagAwareAdapterTest extends TraceableAdapterTest
|
||||||
|
{
|
||||||
|
public function testInvalidateTags()
|
||||||
|
{
|
||||||
|
$pool = new TraceableTagAwareAdapter(new TagAwareAdapter(new FilesystemAdapter()));
|
||||||
|
$pool->invalidateTags(array('foo'));
|
||||||
|
$calls = $pool->getCalls();
|
||||||
|
$this->assertCount(1, $calls);
|
||||||
|
|
||||||
|
$call = $calls[0];
|
||||||
|
$this->assertSame('invalidateTags', $call->name);
|
||||||
|
$this->assertSame(0, $call->hits);
|
||||||
|
$this->assertSame(0, $call->misses);
|
||||||
|
$this->assertNotEmpty($call->start);
|
||||||
|
$this->assertNotEmpty($call->end);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user