<?php
declare(strict_types=1);
namespace Hitso\Bundle\CommonBundle\Media;
use Exception;
use Hitso\Bundle\CommonBundle\Repository\ChangeLogRepository;
use Hitso\Bundle\CommonBundle\Twig\AppExtension;
use Hitso\Bundle\FileManagerBundle\Entity\File;
use Hitso\Bundle\FileManagerBundle\Manager\FileManager;
use Hitso\Bundle\FileManagerBundle\Repository\FileRepository;
use Hitso\Bundle\FileManagerBundle\Service\LoggableReverter\FileLoggableReverter;
use Hitso\Bundle\FileManagerBundle\Twig\FileManagerExtension;
/**
* Class UrlGenerator
* @package Hitso\Bundle\CommonBundle\Media
*/
class UrlGenerator implements MediaUrlProviderInterface
{
/**
* @var MediaUrlProviderInterface[]
*/
protected $urlProviders = [];
/**
* @var FileLoggableReverter
*/
protected $loggableReverter;
/**
* @var ChangeLogRepository
*/
protected $changeLogRepository;
/**
* @var FileRepository
*/
protected $fileRepository;
/**
* @var AppExtension
*/
protected $appExtension;
/**
* @var FileManagerExtension
*/
protected $fileManagerExtension;
/**
* UrlGenerator constructor.
* @param FileLoggableReverter $loggableReverter
* @param ChangeLogRepository $changeLogRepository
* @param AppExtension $appExtension
* @param FileManagerExtension $fileManagerExtension
* @param FileRepository $fileRepository
*/
public function __construct(
FileLoggableReverter $loggableReverter,
ChangeLogRepository $changeLogRepository,
AppExtension $appExtension,
FileManagerExtension $fileManagerExtension,
FileRepository $fileRepository
)
{
$this->loggableReverter = $loggableReverter;
$this->changeLogRepository = $changeLogRepository;
$this->appExtension = $appExtension;
$this->fileManagerExtension = $fileManagerExtension;
$this->fileRepository = $fileRepository;
}
/**
* @param MediaUrlProviderInterface $provider
*/
public function addProvider(MediaUrlProviderInterface $provider): void
{
$this->urlProviders[] = $provider;
}
public function fileUrl($file): ?string
{
$provider = $this->getProviderForFile($file);
if ($provider instanceof MediaUrlProviderInterface) {
return $provider->fileUrl($file);
}
return null;
}
public function fileOrgUrl($file): ?string
{
$provider = $this->getProviderForFile($file);
if ($provider instanceof MediaUrlProviderInterface) {
$idsArray = explode('/', $file->getId());
if (count($idsArray)) {
$fileOrg = $this->fileRepository->find($idsArray[0]);
if ($fileOrg) {
try {
return $this->fileUrl($fileOrg);
} catch (Exception $e) {
return $e->getMessage();
}
}
}
return $provider->fileUrl($file);
}
return null;
}
public function imageUrl(File $file, string $imagineFilterName, array $runtimeConfig = [], int $version = null): ?string
{
$provider = $this->getProviderForFile($file);
if ($provider instanceof MediaUrlProviderInterface) {
if (!$version) {
$version = $this->loggableReverter->getCurrentVersion($file);
}
return $provider->imageUrl($file, $imagineFilterName, $runtimeConfig, $version);
}
return null;
}
public function imgSrc(File $file, string $imagineFilterName = 'content_cover_large', array $runtimeConfig = [], int $version = null): ?string
{
if (in_array($file->getExtension(), FileManager::IMAGE_EXTENSIONS)) {
return $this->imageUrl($file, $imagineFilterName, $runtimeConfig = [], $version = null);
} elseif ($file->getExtension() === 'svg') {
return $this->appExtension->getFmSvgAsString($this->fileManagerExtension->fmPath($file, $version));
}
return null;
}
public function supports($file): bool
{
return false;
}
public function validUrl($file): bool
{
$provider = $this->getProviderForFile($file);
if ($provider instanceof MediaUrlProviderInterface) {
return $provider->validUrl($file);
}
return false;
}
protected function getProviderForFile($file): ?MediaUrlProviderInterface
{
foreach ($this->urlProviders as $provider) {
if ($provider->supports($file)) {
return $provider;
}
}
return null;
}
}