<?php
namespace App\Controller\Uniqskills;
use Imagine\Exception\RuntimeException;
use Liip\ImagineBundle\Exception\Binary\Loader\NotLoadableException;
use Liip\ImagineBundle\Exception\Imagine\Filter\NonExistingFilterException;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Liip\ImagineBundle\Imagine\Data\DataManager;
use Liip\ImagineBundle\Imagine\Filter\FilterManager;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mime\Exception\InvalidArgumentException;
class ImagineController extends \Liip\ImagineBundle\Controller\ImagineController
{
protected $environment;
private $dataManager;
private $filterManager;
private $cacheManager;
private $logger;
private $redirectResponseCode;
/**
* @param DataManager $dataManager
* @param FilterManager $filterManager
* @param CacheManager $cacheManager
* @param LoggerInterface|null $logger
* @param int $redirectResponseCode
* @param string $environment
*/
public function __construct(
DataManager $dataManager,
FilterManager $filterManager,
CacheManager $cacheManager,
LoggerInterface $logger = null,
$redirectResponseCode = 301,
$environment = 'dev'
)
{
$this->dataManager = $dataManager;
$this->filterManager = $filterManager;
$this->cacheManager = $cacheManager;
$this->logger = $logger;
$this->redirectResponseCode = $redirectResponseCode;
$this->environment = $environment;
}
/**
* This action applies a given filter to a given image, optionally saves the image and outputs it to the browser at the same time.
*
* @param Request $request
* @param string $path
* @param string $filter
*
* @return RedirectResponse
*/
public function filterAction(Request $request, $path, $filter)
{
// decoding special characters and whitespaces from path obtained from urls
$path = urldecode($path);
$resolver = $request->get('resolver');
try {
if (($extension = $request->query->get('extension')) !== null) {
$path = str_replace('.webp', '.' . $extension, $path);
}
$oldPath = $path;
if (!$this->cacheManager->isStored($path, $filter, $resolver)) {
try {
$binary = $this->dataManager->find($filter, $path);
} catch (NotLoadableException | InvalidArgumentException $e) {
if ($defaultImageUrl = $this->dataManager->getDefaultImageUrl($filter)) {
return new RedirectResponse($defaultImageUrl);
}
throw new NotFoundHttpException('Source image could not be found', $e);
}
$this->cacheManager->store(
$this->filterManager->applyFilter($binary, $filter),
$path,
$filter,
$resolver
);
}
if ($_ENV['APP_ENV'] == 'prod') {
$url = str_replace('http://', 'https://', $this->cacheManager->resolve($oldPath, $filter, $resolver));
} else {
$url = $this->cacheManager->resolve($oldPath, $filter, $resolver);
}
return new RedirectResponse($url, $this->redirectResponseCode);
} catch (NonExistingFilterException $e) {
$message = sprintf('Could not locate filter "%s" for path "%s". Message was "%s"', $filter, $path, $e->getMessage());
if (null !== $this->logger) {
$this->logger->debug($message);
}
throw new NotFoundHttpException($message, $e);
} catch (RuntimeException $e) {
throw new \RuntimeException(sprintf('Unable to create image for path "%s" and filter "%s". Message was "%s"', $path, $filter, $e->getMessage()), 0, $e);
}
}
}