0

Sonata Media Bundle 您在配置中的提供程序上具有缩略图属性,您可以在其中指定

sonata.media.thumbnail.format
sonata.media.thumbnail.liip_imagine

这一切都很好,sonata.media.thumbnail.format 对于我想要实现的一切都很好。我的问题在于这些文件中发生的事情。

在 FormatThumbnail.php 中有一个名为 generatePublicUrl 的函数,它们在其中生成媒体文件的 url 以及格式化文件的名称。他们在名称或 url 中使用媒体 ID。如果您有私人文件,则不是每个人都必须能够看到这会导致问题,因为很容易将 id 操作到另一个 id。

我知道将提供的公共文件将始终保持公开,因此如果可以猜到 url,用户将访问该文件。出于这个特定原因,我想尝试用捆绑包在创建实际格式化文件之前使用的唯一引用替换该 ID,因为这不会那么容易更改。

我知道仍然存在泄露数据的风险。

我想改变这个

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

但是我尝试创建自己的缩略图文件夹并创建一个新的 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;
    }
}

但是捆绑包仍然使用 id 而不是引用来生成所有内容。有没有更具体的方法来实现扩展这个文件并覆盖函数?

4

1 回答 1

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 类被注入到将在包中使用的任何地方。

于 2015-05-14T15:09:05.063 回答