166 lines
4.9 KiB
PHP
166 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace Gregwar\ImageBundle\Services;
|
|
|
|
use Gregwar\ImageBundle\ImageHandler;
|
|
use Symfony\Component\Config\FileLocatorInterface;
|
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
|
use Symfony\Component\Asset\Packages;
|
|
use Symfony\Component\HttpKernel\KernelInterface;
|
|
|
|
/**
|
|
* Image manipulation service.
|
|
*
|
|
* @author Gregwar <g.passault@gmail.com>
|
|
* @author Sullivan Senechal <soullivaneuh@gmail.com>
|
|
*/
|
|
class ImageHandling
|
|
{
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $cacheDirectory;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $cacheDirMode;
|
|
|
|
/**
|
|
* @var ContainerInterface
|
|
*/
|
|
private $container;
|
|
|
|
/**
|
|
* @var Packages
|
|
*/
|
|
private $assetsPackages;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $handlerClass;
|
|
|
|
/**
|
|
* @var FileLocatorInterface|KernelInterface
|
|
*/
|
|
private $fileLocator;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
private $throwException;
|
|
|
|
/**
|
|
* @param string $cacheDirectory
|
|
* @param int $cacheDirMode
|
|
* @param string $handlerClass
|
|
* @param ContainerInterface $container
|
|
* @param KernelInterface|FileLocatorInterface $fileLocator
|
|
* @param bool $throwException
|
|
* @param string $fallbackImage
|
|
*/
|
|
public function __construct($cacheDirectory, $cacheDirMode, $handlerClass, ContainerInterface $container, Packages $assetsPackages, $fileLocator, $throwException, $fallbackImage)
|
|
{
|
|
if (!$fileLocator instanceof FileLocatorInterface && $fileLocator instanceof KernelInterface) {
|
|
throw new \InvalidArgumentException(
|
|
'Argument 5 passed to '.__METHOD__.' must be an instance of '.
|
|
'Symfony\Component\Config\FileLocatorInterface or Symfony\Component\HttpKernel\KernelInterface.'
|
|
);
|
|
}
|
|
|
|
if ($fileLocator instanceof KernelInterface) {
|
|
@trigger_error(
|
|
'Pass Symfony\Component\HttpKernel\KernelInterface to '.__CLASS__.
|
|
' is deprecated since version 2.1.0 and will be removed in 3.0.'.
|
|
' Use Symfony\Component\Config\FileLocatorInterface instead.',
|
|
E_USER_DEPRECATED
|
|
);
|
|
}
|
|
|
|
$this->cacheDirectory = $cacheDirectory;
|
|
$this->cacheDirMode = intval($cacheDirMode);
|
|
$this->handlerClass = $handlerClass;
|
|
$this->container = $container;
|
|
$this->assetsPackages = $assetsPackages;
|
|
$this->fileLocator = $fileLocator;
|
|
$this->throwException = $throwException;
|
|
$this->fallbackImage = $fallbackImage;
|
|
}
|
|
|
|
/**
|
|
* Get a manipulable image instance.
|
|
*
|
|
* @param string $file the image path
|
|
*
|
|
* @return ImageHandler a manipulable image instance
|
|
*/
|
|
public function open($file)
|
|
{
|
|
if (strlen($file) >= 1 && $file[0] == '@') {
|
|
try {
|
|
if ($this->fileLocator instanceof FileLocatorInterface) {
|
|
$file = $this->fileLocator->locate($file);
|
|
} else {
|
|
$this->fileLocator->locateResource($file);
|
|
}
|
|
} catch (\InvalidArgumentException $exception) {
|
|
if ($this->throwException || false == $this->fallbackImage) {
|
|
throw $exception;
|
|
}
|
|
|
|
$file = $this->fallbackImage;
|
|
}
|
|
}
|
|
|
|
return $this->createInstance($file);
|
|
}
|
|
|
|
/**
|
|
* Get a new image.
|
|
*
|
|
* @param string $w the width
|
|
* @param string $h the height
|
|
*
|
|
* @return ImageHandler a manipulable image instance
|
|
*/
|
|
public function create($w, $h)
|
|
{
|
|
return $this->createInstance(null, $w, $h);
|
|
}
|
|
|
|
/**
|
|
* Creates an instance defining the cache directory.
|
|
*
|
|
* @param string $file
|
|
* @param string|null $w
|
|
* @param string|null $h
|
|
*
|
|
* @return ImageHandler
|
|
*/
|
|
private function createInstance($file, $w = null, $h = null)
|
|
{
|
|
$container = $this->container;
|
|
$webDir = $container->getParameter('gregwar_image.web_dir');
|
|
|
|
$handlerClass = $this->handlerClass;
|
|
/** @var ImageHandler $image */
|
|
$image = new $handlerClass($file, $w, $h, $this->throwException, $this->fallbackImage);
|
|
|
|
$image->setCacheDir($this->cacheDirectory);
|
|
$image->setCacheDirMode($this->cacheDirMode);
|
|
$image->setActualCacheDir($webDir.'/'.$this->cacheDirectory);
|
|
|
|
if ($container->has('templating.helper.assets')) {
|
|
$image->setFileCallback(function ($file) use ($container) {
|
|
return $container->get('templating.helper.assets')->getUrl($file);
|
|
});
|
|
} else {
|
|
$image->setFileCallback(function ($file) use ($container) {
|
|
return $this->assetsPackages->getUrl($file);
|
|
});
|
|
}
|
|
|
|
return $image;
|
|
}
|
|
}
|