Sonata Media Bundle - 如何扩展 FormatThumbnail.php
Sonata Media Bundle - How to extend FormatThumbnail.php
Sonata Media Bundle 你有缩略图 属性 在配置中的提供商上,你可以在其中指定
sonata.media.thumbnail.format
sonata.media.thumbnail.liip_imagine
这一切都很好,sonata.media.thumbnail.format 可以很好地满足我想要实现的所有目标。我的问题在于这些文件中发生了什么。
在 FormatThumbnail.php 中有一个名为 generatePublicUrl 的函数,它们在其中生成媒体文件的 url 以及格式化文件的名称。他们使用名称中的媒体 ID 或 url。如果您有私有文件,则不是每个人都必须能够看到这会导致问题,因为很容易将 id 操纵为另一个 id。
我知道将提供的 public 文件将始终保持 public,因此如果可以猜到 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 bundle 安装和设置 bundle 的步骤进行操作。我有自己的 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 而不是引用来生成所有内容。有没有更具体的方法来实现扩展这个文件和覆盖函数?
在查看了几个不同的包和代码后,我发现它们实际上有一个参数设置为使用 Sonata\MediaBundle\Thumbnail\FormatThumbnail。
解决方法是同时覆盖配置中的参数。
#As top level classification in app/config/config.yml
parameters:
sonata.media.thumbnail.format: Application\Sonata\MediaBundle\Thumbnail\FormatThumbnail
通过这种方式,自定义 FormatThumbnail class 将被注入包中将要使用的任何地方。
Sonata Media Bundle 你有缩略图 属性 在配置中的提供商上,你可以在其中指定
sonata.media.thumbnail.format
sonata.media.thumbnail.liip_imagine
这一切都很好,sonata.media.thumbnail.format 可以很好地满足我想要实现的所有目标。我的问题在于这些文件中发生了什么。
在 FormatThumbnail.php 中有一个名为 generatePublicUrl 的函数,它们在其中生成媒体文件的 url 以及格式化文件的名称。他们使用名称中的媒体 ID 或 url。如果您有私有文件,则不是每个人都必须能够看到这会导致问题,因为很容易将 id 操纵为另一个 id。
我知道将提供的 public 文件将始终保持 public,因此如果可以猜到 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 bundle 安装和设置 bundle 的步骤进行操作。我有自己的 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 而不是引用来生成所有内容。有没有更具体的方法来实现扩展这个文件和覆盖函数?
在查看了几个不同的包和代码后,我发现它们实际上有一个参数设置为使用 Sonata\MediaBundle\Thumbnail\FormatThumbnail。
解决方法是同时覆盖配置中的参数。
#As top level classification in app/config/config.yml
parameters:
sonata.media.thumbnail.format: Application\Sonata\MediaBundle\Thumbnail\FormatThumbnail
通过这种方式,自定义 FormatThumbnail class 将被注入包中将要使用的任何地方。