wolfpack-it/yii2-glide

Yii2 Glide 集成

1.0.0 2021-01-15 10:14 UTC

This package is auto-updated.

Last update: 2024-09-15 18:41:04 UTC


README

此扩展为 Yii2 框架提供了 Glide 集成。

Glide 是一个使图像服务和处理变得非常容易的包。利用 Flysystem,它还从文件系统中抽象出来。

安装

安装此扩展的首选方式是通过 composer

运行

$ composer require wolfpack-it/yii2-glide

或者将以下内容添加到你的 composer.json 文件的 require 部分。

"wolfpack-it/yii2-glide": "^<latest version>"

配置

文件系统

第一步是配置文件系统。有三个

  • 源文件系统(必需)
  • 缓存文件系统(必需)
  • 水印文件系统(可选)

每个文件系统都可以配置为组件或直接在容器中。

组件示例

'components' => [
    'glideSource' => [
        'class' => \creocoder\flysystem\LocalFilesystem::class,
        'path' => '</path/to/source-storage>'
    ],
]

组件

配置的文件系统可以在 Glide 配置中使用

'container' => [
    'definitions' => [
        \WolfpackIT\glide\components\Glide::class => [
            'class' => \WolfpackIT\glide\components\Glide::class,
            'source' => 'glideSource', // via component
            'cache' => [
                'class' => \creocoder\flysystem\LocalFilesystem::class,
                'path' => '</path/to/cache-storage>'
            ], // via configuration
            'watermarks' => \creocoder\flysystem\AwsS3Filesystem:class // via container
        ]
    ]
]

控制器操作

首选用法是在控制器动作方法中的操作

class GlideController extends yii\web\Controller
{
    /**
     * @return array
     */
    public function actions(): array
    {
        return ArrayHelper::merge(
            parent::actions(),
            [
                'index' => [
                    'class' => \WolfpackIT\glide\actions\GlideAction::class
                ]
            ]
        );
    }
}

安全

为了保护你的服务器免受试图调整大量图像的攻击,保护 URL 是一个好的主意。用于此的软件包是 Sam-ITs Url Signer。它使用过期时间签名 URL,并且可以在你不希望任何人更改图像时锁定参数。

它不包含在包中,因为它很容易配置

签名配置

'container' => [
    'definitions' => [
        \SamIT\Yii2\UrlSigner\UrlSigner::class => [
            'secret' => '<secret>',
        ],
    ]
]

控制器中的 HMAC 过滤器

class GlideController extends yii\web\Controller
{
    /**
     * @return array
     */
    public function behaviors(): array
    {
        return ArrayHelper::merge(
            [
                HmacFilter::class => [
                    'class' => HmacFilter::class,
                    'signer' => \Yii::$container->get(\SamIT\Yii2\UrlSigner\UrlSigner::class) //via Dependancy Injection
                    'signer' => $this->controller->module->get('<urlSignerComponent>') // via component
                ]
            ],
            parent::behaviors()
        );
    }

签名 URL

$urlSigner = \Yii::createObject(\SamIT\Yii2\UrlSigner\UrlSigner::class);

$url = [
    '/img/index', // NOTE: This must be the route from the root 
    'path' => '</path/to/image>'
];
$allowAddition = true; // Whether or not to allow image modifications after url generation
$expiration = new DateTime())->add(new DateInterval('P7D'));

$urlSigner->signParams(
    $url,
    $allowAddition,
    $expiration
);

echo yii\helpers\Url::to($url, true);

第二种安全方法

上面提到的包需要过期时间,这意味着每次生成 URL 时都会是唯一的。这导致客户端缓存出现问题。因此,已经添加了另一种方法,尽管它的实现方式略逊一筹,但允许非过期链接。更多信息请查看 这里

签名配置

请确保密钥是安全的,因为使用的散列是 MD5。

'container' => [
    'definitions' => [
         \League\Glide\Signatures\Signature::class => function(\yii\di\Container $container) {
            return \League\Glide\Signatures\SignatureFactory::create('<secret>');
         },
         \League\Glide\Urls\UrlBuilder::class => function(\yii\di\Container $container) {
             return new \League\Glide\Urls\UrlBuilder('', $container->get(\League\Glide\Signatures\Signature::class));
         },
    ]
]

控制器中的签名过滤器

class GlideController extends yii\web\Controller
{
    /**
     * @return array
     */
    public function behaviors(): array
    {
        return ArrayHelper::merge(
            [
                SignatureFilter::class => [
                    'class' => SignatureFilter::class,
                ]
            ],
            parent::behaviors()
        );
    }
}

签名 URL

$urlBuilder = \Yii::createObject(\League\Glide\Urls\UrlBuilder::class);

$url = [
    '/img/index', // NOTE: This must be the route from the root 
    'path' => '</path/to/image>',
];

$options = [
    'w' => 1000,
];

echo $urlBuilder->getUrl(Url::to($url), $options);

待办事项

  • 添加测试

鸣谢

许可证

MIT 许可证 (MIT)。更多信息请参阅 LICENSE