<?php
declare(strict_types=1);
namespace Hitso\Bundle\FileManagerBundle\FileManager;
use Hitso\Bundle\CommonBundle\Doctrine\Service\LoggableReverter;
use Hitso\Bundle\CommonBundle\Media\MediaUrlProviderInterface;
use Hitso\Bundle\CommonBundle\Repository\ChangeLogRepository;
use Hitso\Bundle\FileManagerBundle\Entity\File;
use Hitso\Bundle\FileManagerBundle\Manager\FileManager;
use Hitso\Bundle\FileManagerBundle\Service\LoggableReverter\FileLoggableReverter;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Symfony\Component\Routing\RouterInterface;
use Webmozart\Assert\Assert;
/**
* Class MediaUrlProvider
*/
class MediaUrlProvider implements MediaUrlProviderInterface
{
/**
* @var FileManager
*/
protected $fileManager;
/**
* @var CacheManager
*/
protected $cacheManager;
/**
* @var RouterInterface
*/
protected $router;
/**
* @var LoggableReverter
*/
protected $loggableReverter;
/**
* @var ChangeLogRepository
*/
protected $changeLogRepository;
/**
* MediaUrlProvider constructor.
*
* @param FileManager $fileManager
* @param CacheManager $cacheManager
* @param RouterInterface $router
* @param FileLoggableReverter $loggableReverter
* @param ChangeLogRepository $changeLogRepository
*/
public function __construct(
FileManager $fileManager,
CacheManager $cacheManager,
RouterInterface $router,
FileLoggableReverter $loggableReverter,
ChangeLogRepository $changeLogRepository
) {
$this->fileManager = $fileManager;
$this->cacheManager = $cacheManager;
$this->router = $router;
$this->loggableReverter = $loggableReverter;
$this->changeLogRepository = $changeLogRepository;
}
/**
* @param $file
*
* @return bool
*/
public function validUrl(File $file): bool
{
if (!$file instanceof File || $file->isPrivate()) {
return false;
}
$path = $this->fileManager->getFs()->getFullPathname($file);
return file_exists($path);
}
/**
* @param $file
*
* @return null|string
*/
public function fileUrl(File $file): ?string
{
if (!$this->validUrl($file)) {
return null;
}
return $this->router->generate('fm_file', ['id' => $file->getId()]);
}
/**
* @param File $file
* @param string $imagineFilterName
* @param array $runtimeConfig
* @param int|null $version
*
* @return string|null
* @throws \Exception
*/
public function imageUrl(File $file, string $imagineFilterName, array $runtimeConfig = [], int $version = null): ?string
{
Assert::stringNotEmpty($imagineFilterName, 'Imagine filter name must be provided');
if (null === $version) {
$version = $this->loggableReverter->getCurrentVersion($file);
}
$path = $this->fileManager->getFs()->getPathname($file, $version);
return $this->cacheManager->getBrowserPath($path, $imagineFilterName, $runtimeConfig);
}
/**
* @param $file
*
* @return bool
*/
public function supports($file = null): bool
{
if (!$file instanceof File) {
return false;
}
return $this->validUrl($file);
}
}