diff --git a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php index bbb1f846e4cf5..defa48eed96ad 100644 --- a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php @@ -59,7 +59,8 @@ public function get(string $key, callable $callback, float $beta = null, array & // ArrayAdapter works in memory, we don't care about stampede protection if (INF === $beta || !$item->isHit()) { - $this->save($item->set($callback($item))); + $save = true; + $this->save($item->set($callback($item, $save))); } return $item->get(); diff --git a/src/Symfony/Component/Cache/Adapter/NullAdapter.php b/src/Symfony/Component/Cache/Adapter/NullAdapter.php index f1bdd2bf71916..54cd453565907 100644 --- a/src/Symfony/Component/Cache/Adapter/NullAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/NullAdapter.php @@ -42,7 +42,9 @@ function ($key) { */ public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { - return $callback(($this->createCacheItem)($key)); + $save = true; + + return $callback(($this->createCacheItem)($key), $save); } /** diff --git a/src/Symfony/Component/Cache/Adapter/ProxyAdapter.php b/src/Symfony/Component/Cache/Adapter/ProxyAdapter.php index 8340bdf034177..cf51b90d8d859 100644 --- a/src/Symfony/Component/Cache/Adapter/ProxyAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ProxyAdapter.php @@ -103,9 +103,9 @@ public function get(string $key, callable $callback, float $beta = null, array & return $this->doGet($this, $key, $callback, $beta, $metadata); } - return $this->pool->get($this->getId($key), function ($innerItem) use ($key, $callback) { + return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) { $item = ($this->createCacheItem)($key, $innerItem); - $item->set($value = $callback($item)); + $item->set($value = $callback($item, $save)); ($this->setInnerItem)($innerItem, (array) $item); return $value; diff --git a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php index 5c294d03fd530..660acf54d7bdb 100644 --- a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php @@ -45,10 +45,10 @@ public function get(string $key, callable $callback, float $beta = null, array & } $isHit = true; - $callback = function (CacheItem $item) use ($callback, &$isHit) { + $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) { $isHit = $item->isHit(); - return $callback($item); + return $callback($item, $save); }; $event = $this->start(__FUNCTION__); diff --git a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php index 498c00ca643a4..2b4c9e95bf854 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php @@ -12,9 +12,12 @@ namespace Symfony\Component\Cache\Tests\Adapter; use Cache\IntegrationTests\CachePoolTest; +use PHPUnit\Framework\Assert; +use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; +use Symfony\Contracts\Cache\CallbackInterface; abstract class AdapterTestCase extends CachePoolTest { @@ -57,6 +60,22 @@ public function testGet() $this->assertSame($value, $item->get()); }, INF)); $this->assertFalse($isHit); + + $this->assertSame($value, $cache->get('bar', new class($value) implements CallbackInterface { + private $value; + + public function __construct(int $value) + { + $this->value = $value; + } + + public function __invoke(CacheItemInterface $item, bool &$save) + { + Assert::assertSame('bar', $item->getKey()); + + return $this->value; + } + })); } public function testRecursiveGet()
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: