Skip to content

Commit a619c6c

Browse files
committed
[LazyImage] Fix cache implementation
1 parent 9c5a2f3 commit a619c6c

File tree

4 files changed

+80
-72
lines changed

4 files changed

+80
-72
lines changed

src/LazyImage/src/BlurHash/BlurHash.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Intervention\Image\ImageManager;
1515
use kornrunner\Blurhash\Blurhash as BlurhashEncoder;
16+
use Symfony\Contracts\Cache\CacheInterface;
1617

1718
/**
1819
* @author Titouan Galopin <galopintitouan@gmail.com>
@@ -23,6 +24,7 @@ class BlurHash implements BlurHashInterface
2324
{
2425
public function __construct(
2526
private ?ImageManager $imageManager = null,
27+
private ?CacheInterface $cache = null,
2628
) {
2729
}
2830

@@ -60,6 +62,18 @@ public function encode(string $filename, int $encodingWidth = 75, int $encodingH
6062
throw new \LogicException('To use the Blurhash feature, install kornrunner/blurhash.');
6163
}
6264

65+
if ($this->cache) {
66+
return $this->cache->get(
67+
'blurhash.'.hash('xxh3', $filename.$encodingWidth.$encodingHeight),
68+
fn () => $this->doEncode($filename, $encodingWidth, $encodingHeight)
69+
);
70+
}
71+
72+
return $this->doEncode($filename, $encodingWidth, $encodingHeight);
73+
}
74+
75+
private function doEncode(string $filename, int $encodingWidth = 75, int $encodingHeight = 75): string
76+
{
6377
// Resize image to increase encoding performance
6478
$image = $this->imageManager->make(file_get_contents($filename));
6579
$image->resize($encodingWidth, $encodingHeight, static function ($constraint) {

src/LazyImage/src/BlurHash/CachedBlurHash.php

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/LazyImage/src/DependencyInjection/LazyImageExtension.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
2222
use Symfony\UX\LazyImage\BlurHash\BlurHash;
2323
use Symfony\UX\LazyImage\BlurHash\BlurHashInterface;
24-
use Symfony\UX\LazyImage\BlurHash\CachedBlurHash;
2524
use Symfony\UX\LazyImage\Twig\BlurHashExtension;
2625

2726
/**
@@ -45,23 +44,19 @@ public function load(array $configs, ContainerBuilder $container)
4544

4645
$container
4746
->setDefinition('lazy_image.blur_hash', new Definition(BlurHash::class))
48-
->addArgument(new Reference('lazy_image.image_manager', ContainerInterface::NULL_ON_INVALID_REFERENCE))
47+
->setArgument(0, new Reference('lazy_image.image_manager', ContainerInterface::NULL_ON_INVALID_REFERENCE))
4948
->setPublic(false)
5049
;
5150

52-
$container->setAlias(BlurHashInterface::class, 'lazy_image.blur_hash')->setPublic(false);
53-
5451
if (isset($config['cache'])) {
5552
$container
56-
->setDefinition('lazy_image.cached_blur_hash', new Definition(CachedBlurHash::class))
57-
->setDecoratedService('lazy_image.blur_hash')
58-
->addArgument(new Reference('lazy_image.cached_blur_hash.inner'))
59-
->addArgument(new Reference($config['cache']))
53+
->getDefinition('lazy_image.blur_hash')
54+
->setArgument(1, new Reference($config['cache']))
6055
;
61-
62-
$container->setAlias(BlurHashInterface::class, 'lazy_image.blur_hash')->setPublic(false);
6356
}
6457

58+
$container->setAlias(BlurHashInterface::class, 'lazy_image.blur_hash')->setPublic(false);
59+
6560
$container
6661
->setDefinition('twig.extension.blur_hash', new Definition(BlurHashExtension::class))
6762
->addArgument(new Reference('lazy_image.blur_hash'))

src/LazyImage/tests/BlurHash/BlurHashTest.php

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
use Symfony\Component\Cache\Adapter\ArrayAdapter;
1616
use Symfony\Component\Config\Loader\LoaderInterface;
1717
use Symfony\Component\DependencyInjection\ContainerBuilder;
18+
use Symfony\Contracts\Cache\CacheInterface;
19+
use Symfony\UX\LazyImage\BlurHash\BlurHash;
1820
use Symfony\UX\LazyImage\BlurHash\BlurHashInterface;
19-
use Symfony\UX\LazyImage\BlurHash\CachedBlurHash;
2021
use Symfony\UX\LazyImage\Tests\Kernel\TwigAppKernel;
2122

2223
/**
@@ -50,7 +51,8 @@ public function testEnsureCacheIsNotUsedWhenNotConfigured()
5051
/** @var BlurHashInterface $blurHash */
5152
$blurHash = $container->get('test.lazy_image.blur_hash');
5253

53-
static::assertNotInstanceOf(CachedBlurHash::class, $blurHash);
54+
$this->assertInstanceOf(BlurHash::class, $blurHash);
55+
$this->assertNull($this->extractCache($blurHash));
5456
}
5557

5658
public function testEnsureCacheIsUsedWhenConfigured()
@@ -86,43 +88,83 @@ public function registerContainerConfiguration(LoaderInterface $loader)
8688
/** @var BlurHashInterface $blurHash */
8789
$blurHash = $container->get('test.lazy_image.blur_hash');
8890

89-
static::assertInstanceOf(CachedBlurHash::class, $blurHash);
91+
$this->assertInstanceOf(BlurHash::class, $blurHash);
92+
$this->assertInstanceOf(CacheInterface::class, $this->extractCache($blurHash));
9093
}
9194

92-
public function testEncodeShouldBeCalledOnceWhenCached()
95+
public function testCreateDataUriThumbnail()
9396
{
94-
$blurHash = $this->createMock(BlurHashInterface::class);
95-
$blurHash->expects($this->once())->method('encode')->with(__DIR__.'/../Fixtures/logo.png')->willReturn('L54ec*~q_3?bofoffQWB9F9FD%IU');
96-
$cache = new ArrayAdapter();
97-
$cachedBlurHash = new CachedBlurHash($blurHash, $cache);
98-
99-
$this->assertEmpty($cache->getValues());
97+
$kernel = new TwigAppKernel('test', true);
98+
$kernel->boot();
99+
$container = $kernel->getContainer()->get('test.service_container');
100100

101-
$this->assertSame(
102-
'L54ec*~q_3?bofoffQWB9F9FD%IU',
103-
$cachedBlurHash->encode(__DIR__.'/../Fixtures/logo.png')
104-
);
101+
/** @var BlurHashInterface $blurHash */
102+
$blurHash = $container->get('test.lazy_image.blur_hash');
105103

106-
$this->assertNotEmpty($cache->getValues());
104+
$this->assertInstanceOf(BlurHash::class, $blurHash);
105+
$this->assertNull($this->extractCache($blurHash));
107106

108107
$this->assertSame(
109-
'L54ec*~q_3?bofoffQWB9F9FD%IU',
110-
$cachedBlurHash->encode(__DIR__.'/../Fixtures/logo.png')
108+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gODAK/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo/8AAEQgAOgDqAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8k8g00wH0rofsftTTZ+1AHOtAaieA10bWftUL2ftQBzbwGq0kBrppLT2qrLae1AHMSwGs+4tyc11ctr7VRntfagDj5oWQk44qGuluLQc8Vk3VngkrxQBQopWUqcGkoAKKKKACiiigAooqRIXbtQBHRVtLMnrUy2Q9KAM6itQWQ9KDZD0oAy6K0Gsh6VE9oR0oAqUVI8Lr2qMjHWgAooooAKKKKAPov7OPSmm3HpWhgU1gKAM1rcelQPbj0rUcCoJAKAMmSAelVJYB6VsSgVTlAoAxpoR6VRnhHpWzMBWfOBzQBi3EI5rLuYRg8Vu3GOayrnHNAHO3sA5IrPPBravMYNYz/eNACUUUUAFKqljgUlTWwGaALFvbjvV+KAelNgA4q7EBQAiQj0qVYR6VKgqZRQBX8kelBhHpVoCgigCk0I9KheEelaDAVC4FAGZLAKpT249K2JAKpzAUAY0iFTTKuXAHNU6ACiiigD6S84U1phWP9s96abz3oA1XmFQSTCs1rv3qB7v3oA0JZh61TllFUpbv3qpLd+9AFqaUVnzyiq812Oeaz7i7HPNAE1xKOeayrqYc81Dd3ygHJrGubxpCQvT1oAde3GThapUHmigAooooAKdG21s02igDUt5gQOavxSCueRyh4q3Dd44NAHQJJUyyVix3QPerC3I9aANTzKDIKzhcj1pDcj1oAvtJULyVSa5HrVeS7A70AXJZBVGeYDPNVpbvPSqruzHk0APmk3HioqKKACiiigD1X7WfWmm7PrVA000AXGuz61C92fWqrVA9AFiS8PrVSa896hlqlP3oAfcX+M81lXF+zkhfzqO8NVKAFd2c5Y5pKKKACiiigAooooAKKKKACiiigBQxHQ08TOO9R0UATfaHpDcOaiooAeZXPemEk9aKKACiiigAooooAKKKKAP/9k=',
109+
$blurHash->createDataUriThumbnail(__DIR__.'/../Fixtures/logo.png', 234, 58)
111110
);
112111
}
113112

114-
public function testCreateDataUriThumbnail()
113+
public function testCreateDataUriThumbnailWithCache()
115114
{
116-
$kernel = new TwigAppKernel('test', true);
115+
$kernel = new class('test', true) extends TwigAppKernel {
116+
public function registerContainerConfiguration(LoaderInterface $loader)
117+
{
118+
parent::registerContainerConfiguration($loader);
119+
120+
$loader->load(static function (ContainerBuilder $container) {
121+
$container->loadFromExtension('framework', [
122+
'cache' => [
123+
'pools' => [
124+
'cache.lazy_image' => [
125+
'adapter' => 'cache.adapter.array',
126+
],
127+
],
128+
],
129+
]);
130+
131+
$container->loadFromExtension('lazy_image', [
132+
'cache' => 'cache.lazy_image',
133+
]);
134+
135+
$container->setAlias('test.cache.lazy_image', 'cache.lazy_image')->setPublic(true);
136+
});
137+
}
138+
};
139+
117140
$kernel->boot();
118141
$container = $kernel->getContainer()->get('test.service_container');
119142

120143
/** @var BlurHashInterface $blurHash */
121144
$blurHash = $container->get('test.lazy_image.blur_hash');
122145

146+
$this->assertInstanceOf(BlurHash::class, $blurHash);
147+
$this->assertInstanceOf(ArrayAdapter::class, $cache = $this->extractCache($blurHash));
148+
149+
$this->assertEmpty($cache->getValues());
150+
151+
$this->assertSame(
152+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gODAK/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo/8AAEQgAOgDqAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8k8g00wH0rofsftTTZ+1AHOtAaieA10bWftUL2ftQBzbwGq0kBrppLT2qrLae1AHMSwGs+4tyc11ctr7VRntfagDj5oWQk44qGuluLQc8Vk3VngkrxQBQopWUqcGkoAKKKKACiiigAooqRIXbtQBHRVtLMnrUy2Q9KAM6itQWQ9KDZD0oAy6K0Gsh6VE9oR0oAqUVI8Lr2qMjHWgAooooAKKKKAPov7OPSmm3HpWhgU1gKAM1rcelQPbj0rUcCoJAKAMmSAelVJYB6VsSgVTlAoAxpoR6VRnhHpWzMBWfOBzQBi3EI5rLuYRg8Vu3GOayrnHNAHO3sA5IrPPBravMYNYz/eNACUUUUAFKqljgUlTWwGaALFvbjvV+KAelNgA4q7EBQAiQj0qVYR6VKgqZRQBX8kelBhHpVoCgigCk0I9KheEelaDAVC4FAGZLAKpT249K2JAKpzAUAY0iFTTKuXAHNU6ACiiigD6S84U1phWP9s96abz3oA1XmFQSTCs1rv3qB7v3oA0JZh61TllFUpbv3qpLd+9AFqaUVnzyiq812Oeaz7i7HPNAE1xKOeayrqYc81Dd3ygHJrGubxpCQvT1oAde3GThapUHmigAooooAKdG21s02igDUt5gQOavxSCueRyh4q3Dd44NAHQJJUyyVix3QPerC3I9aANTzKDIKzhcj1pDcj1oAvtJULyVSa5HrVeS7A70AXJZBVGeYDPNVpbvPSqruzHk0APmk3HioqKKACiiigD1X7WfWmm7PrVA000AXGuz61C92fWqrVA9AFiS8PrVSa896hlqlP3oAfcX+M81lXF+zkhfzqO8NVKAFd2c5Y5pKKKACiiigAooooAKKKKACiiigBQxHQ08TOO9R0UATfaHpDcOaiooAeZXPemEk9aKKACiiigAooooAKKKKAP/9k=',
153+
$blurHash->createDataUriThumbnail(__DIR__.'/../Fixtures/logo.png', 234, 58)
154+
);
155+
156+
$this->assertNotEmpty($cache->getValues());
157+
123158
$this->assertSame(
124159
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gODAK/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo/8AAEQgAOgDqAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8k8g00wH0rofsftTTZ+1AHOtAaieA10bWftUL2ftQBzbwGq0kBrppLT2qrLae1AHMSwGs+4tyc11ctr7VRntfagDj5oWQk44qGuluLQc8Vk3VngkrxQBQopWUqcGkoAKKKKACiiigAooqRIXbtQBHRVtLMnrUy2Q9KAM6itQWQ9KDZD0oAy6K0Gsh6VE9oR0oAqUVI8Lr2qMjHWgAooooAKKKKAPov7OPSmm3HpWhgU1gKAM1rcelQPbj0rUcCoJAKAMmSAelVJYB6VsSgVTlAoAxpoR6VRnhHpWzMBWfOBzQBi3EI5rLuYRg8Vu3GOayrnHNAHO3sA5IrPPBravMYNYz/eNACUUUUAFKqljgUlTWwGaALFvbjvV+KAelNgA4q7EBQAiQj0qVYR6VKgqZRQBX8kelBhHpVoCgigCk0I9KheEelaDAVC4FAGZLAKpT249K2JAKpzAUAY0iFTTKuXAHNU6ACiiigD6S84U1phWP9s96abz3oA1XmFQSTCs1rv3qB7v3oA0JZh61TllFUpbv3qpLd+9AFqaUVnzyiq812Oeaz7i7HPNAE1xKOeayrqYc81Dd3ygHJrGubxpCQvT1oAde3GThapUHmigAooooAKdG21s02igDUt5gQOavxSCueRyh4q3Dd44NAHQJJUyyVix3QPerC3I9aANTzKDIKzhcj1pDcj1oAvtJULyVSa5HrVeS7A70AXJZBVGeYDPNVpbvPSqruzHk0APmk3HioqKKACiiigD1X7WfWmm7PrVA000AXGuz61C92fWqrVA9AFiS8PrVSa896hlqlP3oAfcX+M81lXF+zkhfzqO8NVKAFd2c5Y5pKKKACiiigAooooAKKKKACiiigBQxHQ08TOO9R0UATfaHpDcOaiooAeZXPemEk9aKKACiiigAooooAKKKKAP/9k=',
125160
$blurHash->createDataUriThumbnail(__DIR__.'/../Fixtures/logo.png', 234, 58)
126161
);
162+
163+
$this->assertNotEmpty($cache->getValues());
164+
}
165+
166+
private function extractCache(BlurHash $blurHash): ?CacheInterface
167+
{
168+
return \Closure::bind(fn () => $this->cache, $blurHash, BlurHash::class)();
127169
}
128170
}

0 commit comments

Comments
 (0)