0

Sonata Media Bundle には、プロバイダーのサムネイル プロパティが設定されており、いずれかを指定できます。

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

これはすべて問題なく、sonata.media.thumbnail.format は、私が達成したいすべてのものに対して正常に機能します。私の問題は、これらのファイル内で何が起こるかということです。

FormatThumbnail.php には、メディア ファイルの URL とフォーマットされたファイルの名前を生成する generatePublicUrl という関数があります。名前または 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 のサイトの手順に従いました。元の Sonata\MediaBundle を拡張する独自の Application\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;
    }
}

ただし、バンドルは参照の代わりに 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 に答える