vendor/ezsystems/ezpublish-kernel/eZ/Bundle/EzPublishCoreBundle/Imagine/AliasGenerator.php line 160

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) eZ Systems AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. namespace eZ\Bundle\EzPublishCoreBundle\Imagine;
  7. use eZ\Publish\API\Repository\Exceptions\InvalidVariationException;
  8. use eZ\Publish\Core\MVC\Exception\SourceImageNotFoundException;
  9. use eZ\Publish\API\Repository\Values\Content\Field;
  10. use eZ\Publish\API\Repository\Values\Content\VersionInfo;
  11. use eZ\Publish\SPI\Variation\Values\ImageVariation;
  12. use eZ\Publish\SPI\Variation\VariationHandler;
  13. use eZ\Publish\SPI\FieldType\Value;
  14. use eZ\Publish\Core\FieldType\Image\Value as ImageValue;
  15. use Imagine\Exception\RuntimeException;
  16. use Liip\ImagineBundle\Binary\BinaryInterface;
  17. use Liip\ImagineBundle\Binary\Loader\LoaderInterface;
  18. use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
  19. use Liip\ImagineBundle\Exception\Imagine\Cache\Resolver\NotResolvableException;
  20. use Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface;
  21. use Liip\ImagineBundle\Imagine\Filter\FilterConfiguration;
  22. use Liip\ImagineBundle\Imagine\Filter\FilterManager;
  23. use Psr\Log\LoggerInterface;
  24. use InvalidArgumentException;
  25. use Psr\Log\NullLogger;
  26. use SplFileInfo;
  27. /**
  28.  * Image alias generator using LiipImagineBundle API.
  29.  * Doesn't use DataManager/CacheManager as it's directly bound to IO Repository for convenience.
  30.  */
  31. class AliasGenerator implements VariationHandler
  32. {
  33.     const ALIAS_ORIGINAL 'original';
  34.     /** @var \Psr\Log\LoggerInterface */
  35.     private $logger;
  36.     /**
  37.      * Loader used to retrieve the original image.
  38.      * DataManager is not used to remain independent from ImagineBundle configuration.
  39.      *
  40.      * @var \Liip\ImagineBundle\Binary\Loader\LoaderInterface
  41.      */
  42.     private $dataLoader;
  43.     /** @var \Liip\ImagineBundle\Imagine\Filter\FilterManager */
  44.     private $filterManager;
  45.     /** @var FilterConfiguration */
  46.     private $filterConfiguration;
  47.     /** @var \Liip\ImagineBundle\Imagine\Cache\Resolver\ResolverInterface */
  48.     private $ioResolver;
  49.     public function __construct(
  50.         LoaderInterface $dataLoader,
  51.         FilterManager $filterManager,
  52.         ResolverInterface $ioResolver,
  53.         FilterConfiguration $filterConfiguration,
  54.         LoggerInterface $logger null
  55.     ) {
  56.         $this->dataLoader $dataLoader;
  57.         $this->filterManager $filterManager;
  58.         $this->ioResolver $ioResolver;
  59.         $this->filterConfiguration $filterConfiguration;
  60.         $this->logger null !== $logger $logger : new NullLogger();
  61.     }
  62.     /**
  63.      * {@inheritdoc}
  64.      *
  65.      * @throws \InvalidArgumentException If field value is not an instance of \eZ\Publish\Core\FieldType\Image\Value.
  66.      * @throws \eZ\Publish\Core\MVC\Exception\SourceImageNotFoundException If source image cannot be found.
  67.      * @throws \eZ\Publish\API\Repository\Exceptions\InvalidVariationException If a problem occurs with generated variation.
  68.      */
  69.     public function getVariation(Field $fieldVersionInfo $versionInfo$variationName, array $parameters = [])
  70.     {
  71.         /** @var \eZ\Publish\Core\FieldType\Image\Value $imageValue */
  72.         $imageValue $field->value;
  73.         $fieldId $field->id;
  74.         $fieldDefIdentifier $field->fieldDefIdentifier;
  75.         if (!$this->supportsValue($imageValue)) {
  76.             throw new InvalidArgumentException("Value for field #$fieldId ($fieldDefIdentifier) cannot be used for image alias generation.");
  77.         }
  78.         $originalPath $imageValue->id;
  79.         $variationWidth $variationHeight null;
  80.         // Create the image alias only if it does not already exist.
  81.         if ($variationName !== IORepositoryResolver::VARIATION_ORIGINAL && !$this->ioResolver->isStored($originalPath$variationName)) {
  82.             try {
  83.                 $originalBinary $this->dataLoader->find($originalPath);
  84.             } catch (NotLoadableException $e) {
  85.                 throw new SourceImageNotFoundException($originalPath0$e);
  86.             }
  87.             $this->logger->debug("Generating '$variationName' variation on $originalPath, field #$fieldId ($fieldDefIdentifier)");
  88.             $this->ioResolver->store(
  89.                 $this->applyFilter($originalBinary$variationName),
  90.                 $originalPath,
  91.                 $variationName
  92.             );
  93.         } else {
  94.             if ($variationName === IORepositoryResolver::VARIATION_ORIGINAL) {
  95.                 $variationWidth $imageValue->width;
  96.                 $variationHeight $imageValue->height;
  97.             }
  98.             $this->logger->debug("'$variationName' variation on $originalPath is already generated. Loading from cache.");
  99.         }
  100.         try {
  101.             $aliasInfo = new SplFileInfo(
  102.                 $this->ioResolver->resolve($originalPath$variationName)
  103.             );
  104.         } catch (NotResolvableException $e) {
  105.             // If for some reason image alias cannot be resolved, throw the appropriate exception.
  106.             throw new InvalidVariationException($variationName'image'0$e);
  107.         } catch (RuntimeException $e) {
  108.             throw new InvalidVariationException($variationName'image'0$e);
  109.         }
  110.         return new ImageVariation(
  111.             [
  112.                 'name' => $variationName,
  113.                 'fileName' => $aliasInfo->getFilename(),
  114.                 'dirPath' => $aliasInfo->getPath(),
  115.                 'uri' => $aliasInfo->getPathname(),
  116.                 'imageId' => $imageValue->imageId,
  117.                 'width' => $variationWidth,
  118.                 'height' => $variationHeight,
  119.             ]
  120.         );
  121.     }
  122.     /**
  123.      * Applies $variationName filters on $image.
  124.      *
  125.      * Both variations configured in eZ (SiteAccess context) and LiipImagineBundle are used.
  126.      * An eZ variation may have a "reference".
  127.      * In that case, reference's filters are applied first, recursively (a reference may also have another reference).
  128.      * Reference must be a valid variation name, configured in eZ or in LiipImagineBundle.
  129.      *
  130.      * @param BinaryInterface $image
  131.      * @param string $variationName
  132.      *
  133.      * @return \Liip\ImagineBundle\Binary\BinaryInterface
  134.      */
  135.     private function applyFilter(BinaryInterface $image$variationName)
  136.     {
  137.         $filterConfig $this->filterConfiguration->get($variationName);
  138.         // If the variation has a reference, we recursively call this method to apply reference's filters.
  139.         if (isset($filterConfig['reference']) && $filterConfig['reference'] !== IORepositoryResolver::VARIATION_ORIGINAL) {
  140.             $image $this->applyFilter($image$filterConfig['reference']);
  141.         }
  142.         return $this->filterManager->applyFilter($image$variationName);
  143.     }
  144.     public function supportsValue(Value $value)
  145.     {
  146.         return $value instanceof ImageValue;
  147.     }
  148. }