Symfony — Sonata Media Bundle — Как расширить FormatThumbnail.Stack Overflow

Соната 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;
}
}

Но пакет все еще генерирует все, используя идентификатор вместо ссылки. Есть ли более конкретный способ добиться расширения этого файла и переопределения функции?

0

Решение

Посмотрев несколько разных пакетов и просмотрев код, я обнаружил, что у них физически есть параметр, который настроен на использование Sonata \ MediaBundle \ Thumbnail \ FormatThumbnail.

Решение состоит в том, чтобы переопределить параметр в конфигурации, а также.

#As top level classification in app/config/config.yml
parameters:
sonata.media.thumbnail.format: Application\Sonata\MediaBundle\Thumbnail\FormatThumbnail

Таким образом, пользовательский класс FormatThumbnail внедряется везде, где он будет использоваться в комплекте.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]