Соната Media Bundle у вас есть свойство эскиза на провайдера в конфигурации, где вы можете указать либо
sonata.media.thumbnail.format
sonata.media.thumbnail.liip_imagine
Это все хорошо, и sonata.media.thumbnail.format один отлично работает для всего, чего я хочу достичь. Моя проблема связана с тем, что происходит внутри этих файлов.
В FormatThumbnail.php есть функция generatePublicUrl, где они генерируют URL-адрес медиа-файла, а также имя отформатированного файла. Они используют идентификатор медиа в имени или URL. Если у вас есть личные файлы, не все должны видеть, что это вызывает проблему, легко манипулировать идентификатором с другим идентификатором.
Я знаю, что открытые файлы, которые будут обслуживаться, всегда будут оставаться открытыми, поэтому, если можно будет угадать URL, пользователь получит доступ к файлу. По этой конкретной причине я хочу попробовать заменить этот идентификатор уникальной ссылкой, которую использует пакет, прежде чем они будут создавать фактические отформатированные файлы, так как это будет не так просто изменить.
Я знаю, что все еще существуют риски утечки данных.
Я хочу изменить это
public function generatePublicUrl(MediaProviderInterface $provider, MediaInterface $media, $format)
{
if ($format == 'reference') {
$path = $provider->getReferenceImage($media);
} else {
$path = sprintf('%s/thumb_%s_%s.%s', $provider->generatePath($media), $media->getId(), $format, $this->getExtension($media));
}
return $path;
}
к этому
public function generatePublicUrl(MediaProviderInterface $provider, MediaInterface $media, $format)
{
if ($format == 'reference') {
$path = $provider->getReferenceImage($media);
} else {
$path = sprintf('%s/thumb_%s_%s.%s', $provider->generatePath($media), $media->getProviderReference(), $format, $this->getExtension($media));
}
return $path;
}
Как я могу переопределить файл, который пакет просто получает изменения?
Я следовал инструкциям на сайте Sonata о том, как установить и настроить пакет с помощью пакета easy extends. У меня есть собственная папка Application \ Sonata \ MediaBundle, которая расширяет исходную Sonata \ MediaBundle.
Информацию по установке смотрите в документации (https://sonata-project.org/bundles/media/master/doc/reference/installation.html)
Однако я попытался создать собственную папку Thumbnail и создать новый FormatThumbnail.php следующим образом
<?php
namespace Application\Sonata\MediaBundle\Thumbnail;
use Sonata\MediaBundle\Model\MediaInterface;
use Sonata\MediaBundle\Provider\MediaProviderInterface;
use Sonata\MediaBundle\Thumbnail\FormatThumbnail as BaseFormatThumbnail;
class FormatThumbnail extends BaseFormatThumbnail
{
/**
* Overriding this to replace the id with the reference
*
* {@inheritdoc}
*/
public function generatePublicUrl(MediaProviderInterface $provider, MediaInterface $media, $format)
{
if ($format == 'reference') {
$path = $provider->getReferenceImage($media);
} else {
$path = sprintf('%s/thumb_%s_%s.%s', $provider->generatePath($media), $media->getProviderReference(), $format, $this->getExtension($media));
}
return $path;
}
}
Но пакет все еще генерирует все, используя идентификатор вместо ссылки. Есть ли более конкретный способ добиться расширения этого файла и переопределения функции?
Посмотрев несколько разных пакетов и просмотрев код, я обнаружил, что у них физически есть параметр, который настроен на использование Sonata \ MediaBundle \ Thumbnail \ FormatThumbnail.
Решение состоит в том, чтобы переопределить параметр в конфигурации, а также.
#As top level classification in app/config/config.yml
parameters:
sonata.media.thumbnail.format: Application\Sonata\MediaBundle\Thumbnail\FormatThumbnail
Таким образом, пользовательский класс FormatThumbnail внедряется везде, где он будет использоваться в комплекте.
Других решений пока нет …