diff --git a/doc/data-loaders-custom.rst b/doc/data-loaders-custom.rst index 7aa23b26c..7d83b0da4 100644 --- a/doc/data-loaders-custom.rst +++ b/doc/data-loaders-custom.rst @@ -25,7 +25,17 @@ path to the image and needs to return an instance of ``BinaryInterface``. to sanitize this parameter in your loader to avoid exposing files outside of your image collections. -You need to `configure a service`_ with your custom loader and tag it with +Register it: automatically +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, your loader will be automatically registered as it implements the ``LoaderInterface``. + +You will be able to reference and use your custom loader in your configuration by using its Fully Qualified Class Name. + +Register it: manually +^^^^^^^^^^^^^^^^^^^^^ + +If you want to give it a different name you need to `configure a service`_ with your custom loader and tag it with ``liip_imagine.binary.loader``. To register ``App\Service\MyCustomDataLoader`` with the name diff --git a/doc/filters.rst b/doc/filters.rst index 9c41d6b2c..f7d20a08b 100644 --- a/doc/filters.rst +++ b/doc/filters.rst @@ -53,7 +53,17 @@ The ``LoaderInterface`` has the method ``load``, which is provided an instance of ``ImageInterface`` and an array of options. It must return an ``ImageInterface``. -You need to `configure a service`_ and tag it ``liip_imagine.filter.loader``. +Register it: automatically +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, your filter will be automatically registered as it implements the ``LoaderInterface``. + +You will be able to reference and use your custom filter when defining filter sets in your configuration by using its Fully Qualified Class Name. + +Register it: manually +^^^^^^^^^^^^^^^^^^^^^ + +If you want to give it a different name you need to `configure a service`_ and tag it ``liip_imagine.filter.loader``. To register a filter ``App\Service\MyCustomFilter`` as ``my_custom_filter``, use the following configuration: @@ -124,7 +134,7 @@ to the image, by passing configuration as third parameter to ``applyFilter``: public function filter(int $width, int $height) { $filter = '...'; // Name of the `filter_set` in `config/packages/liip_imagine.yaml` $path = '...'; // Path of the image, relative to `/public/` - + if (!$this->cacheManager->isStored($path, $filter)) { $binary = $this->dataManager->find($filter, $path); diff --git a/doc/optimizations/resolve-cache-images-in-background.rst b/doc/optimizations/resolve-cache-images-in-background.rst index b4f41d34e..250bcbcaa 100644 --- a/doc/optimizations/resolve-cache-images-in-background.rst +++ b/doc/optimizations/resolve-cache-images-in-background.rst @@ -7,7 +7,7 @@ the result. Then it redirects the client to the generated image file. This works without any further tooling. There are some important disadvantages however: -* Applying all the filters to an images can take a lot of time and memory; +* Applying all the filters to an image can take a lot of time and memory; * The images have to be processed by the web server answering web requests. This increases the load on the server and may affect performance; * The resolve controller URL is different from the cached image URL. When the image needs to be @@ -33,7 +33,7 @@ First, `install symfony/messenger`_ with composer: .. code-block:: terminal - $ composer require symfony/messenger + composer require symfony/messenger .. code-block:: yaml @@ -70,7 +70,7 @@ We need to run at least one consumer for the messages: .. code-block:: terminal - $ php bin/console messenger:consume liip_imagine --time-limit=3600 --memory-limit=256M + php bin/console messenger:consume liip_imagine --time-limit=3600 --memory-limit=256M You can run the consumers on a separate machine, as long as it shares the same storage for the cached images. In a cloud system, you could even scale consumers based on the queue size to get diff --git a/doc/post-processors.rst b/doc/post-processors.rst index 64b2e0178..57fe3d470 100644 --- a/doc/post-processors.rst +++ b/doc/post-processors.rst @@ -131,7 +131,17 @@ for your custom post-processor. } } -You need to `configure a service`_ with your custom post-processor and tag it +Register it: automatically +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, your post-processor will be automatically registered as it implements the ``PostProcessorInterface``. + +You will be able to reference and use your custom post-processor in your configuration by using its Fully Qualified Class Name. + +Register it: manually +^^^^^^^^^^^^^^^^^^^^^ + +If you want to give it a different name you need to `configure a service`_ with your custom post-processor and tag it with ``liip_imagine.filter.post_processor``. To register ``App\Service\MyCustomPostProcessor`` with the name diff --git a/src/DependencyInjection/Compiler/FiltersCompilerPass.php b/src/DependencyInjection/Compiler/FiltersCompilerPass.php index 64302793e..891eba47c 100644 --- a/src/DependencyInjection/Compiler/FiltersCompilerPass.php +++ b/src/DependencyInjection/Compiler/FiltersCompilerPass.php @@ -24,7 +24,7 @@ public function process(ContainerBuilder $container): void $manager = $container->getDefinition('liip_imagine.filter.manager'); foreach ($tags as $id => $tag) { - $manager->addMethodCall('addLoader', [$tag[0]['loader'], new Reference($id)]); + $manager->addMethodCall('addLoader', [$tag[0]['loader'] ?? $id, new Reference($id)]); $this->log($container, 'Registered filter loader: %s', $id); } } diff --git a/src/DependencyInjection/Compiler/LoadersCompilerPass.php b/src/DependencyInjection/Compiler/LoadersCompilerPass.php index e3b7c8986..74642aa2a 100644 --- a/src/DependencyInjection/Compiler/LoadersCompilerPass.php +++ b/src/DependencyInjection/Compiler/LoadersCompilerPass.php @@ -24,7 +24,7 @@ public function process(ContainerBuilder $container): void $manager = $container->getDefinition('liip_imagine.data.manager'); foreach ($tags as $id => $tag) { - $manager->addMethodCall('addLoader', [$tag[0]['loader'], new Reference($id)]); + $manager->addMethodCall('addLoader', [$tag[0]['loader'] ?? $id, new Reference($id)]); $this->log($container, 'Registered binary loader: %s', $id); } } diff --git a/src/DependencyInjection/Compiler/PostProcessorsCompilerPass.php b/src/DependencyInjection/Compiler/PostProcessorsCompilerPass.php index 8d3b46bd1..a3b45348f 100644 --- a/src/DependencyInjection/Compiler/PostProcessorsCompilerPass.php +++ b/src/DependencyInjection/Compiler/PostProcessorsCompilerPass.php @@ -29,7 +29,7 @@ public function process(ContainerBuilder $container): void $manager = $container->getDefinition('liip_imagine.filter.manager'); foreach ($tags as $id => $tag) { - $manager->addMethodCall('addPostProcessor', [$tag[0]['post_processor'], new Reference($id)]); + $manager->addMethodCall('addPostProcessor', [$tag[0]['post_processor'] ?? $id, new Reference($id)]); $this->log($container, 'Registered filter post-processor: %s', $id); } } diff --git a/src/LiipImagineBundle.php b/src/LiipImagineBundle.php index b6a6344d6..2d3ef5150 100644 --- a/src/LiipImagineBundle.php +++ b/src/LiipImagineBundle.php @@ -11,6 +11,7 @@ namespace Liip\ImagineBundle; +use Liip\ImagineBundle\Binary\Loader\LoaderInterface as BinaryLoaderInterface; use Liip\ImagineBundle\DependencyInjection\Compiler\AssetsVersionCompilerPass; use Liip\ImagineBundle\DependencyInjection\Compiler\DriverCompilerPass; use Liip\ImagineBundle\DependencyInjection\Compiler\FiltersCompilerPass; @@ -26,6 +27,8 @@ use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\FlysystemResolverFactory; use Liip\ImagineBundle\DependencyInjection\Factory\Resolver\WebPathResolverFactory; use Liip\ImagineBundle\DependencyInjection\LiipImagineExtension; +use Liip\ImagineBundle\Imagine\Filter\Loader\LoaderInterface as LoaderLoaderInterface; +use Liip\ImagineBundle\Imagine\Filter\PostProcessor\PostProcessorInterface; use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -55,5 +58,9 @@ public function build(ContainerBuilder $container): void $extension->addLoaderFactory(new FileSystemLoaderFactory()); $extension->addLoaderFactory(new FlysystemLoaderFactory()); $extension->addLoaderFactory(new ChainLoaderFactory()); + + $container->registerForAutoconfiguration(LoaderLoaderInterface::class)->addTag('liip_imagine.filter.loader'); + $container->registerForAutoconfiguration(PostProcessorInterface::class)->addTag('liip_imagine.filter.post_processor'); + $container->registerForAutoconfiguration(BinaryLoaderInterface::class)->addTag('liip_imagine.binary.loader'); } } diff --git a/tests/LiipImagineBundleTest.php b/tests/LiipImagineBundleTest.php index 70c0ba90d..ec8486c90 100644 --- a/tests/LiipImagineBundleTest.php +++ b/tests/LiipImagineBundleTest.php @@ -30,6 +30,7 @@ use Liip\ImagineBundle\DependencyInjection\LiipImagineExtension; use Liip\ImagineBundle\LiipImagineBundle; use PHPUnit\Framework\MockObject\MockObject; +use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; @@ -60,6 +61,10 @@ public function testAddPasses(): void return true; })); + $containerMock + ->expects($this->exactly(3)) + ->method('registerForAutoconfiguration') + ->willReturn($this->createMock(ChildDefinition::class)); $bundle = new LiipImagineBundle(); $bundle->build($containerMock); @@ -97,6 +102,10 @@ public function testAddResolvers(): void ->method('getExtension') ->with('liip_imagine') ->willReturn($extensionMock); + $containerMock + ->expects($this->exactly(3)) + ->method('registerForAutoconfiguration') + ->willReturn($this->createMock(ChildDefinition::class)); $bundle = new LiipImagineBundle(); $bundle->build($containerMock); @@ -125,6 +134,11 @@ public function testAddLoaders(): void ->method('getExtension') ->with('liip_imagine') ->willReturn($extensionMock); + $containerMock + ->expects($this->exactly(3)) + ->method('registerForAutoconfiguration') + ->willReturn($this->createMock(ChildDefinition::class)); + $bundle = new LiipImagineBundle(); $bundle->build($containerMock);