agielks/yii2-aws-s3

为 Yii2 的 Amazon S3 组件

安装: 670

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.0 2022-07-05 03:09 UTC

This package is auto-updated.

Last update: 2024-09-06 11:05:54 UTC


README

为 Yii2 的 Amazon S3 组件。

Latest Stable Version Total Downloads Latest Unstable Version License

Yii2 AWS S3 使用 SemVer

安装

  1. 运行 Composer 命令以安装最新版本

    composer require agielks/yii2-aws-s3 ~1.0
  2. 将组件添加到 config/main.php

    'components' => [
        // ...
        's3' => [
            'class' => 'agielks\yii2\aws\s3\Service',
            'endpoint' => 'my-endpoint',
            'usePathStyleEndpoint' => true,
            'credentials' => [ // Aws\Credentials\CredentialsInterface|array|callable
                'key' => 'my-key',
                'secret' => 'my-secret',
            ],
            'region' => 'my-region',
            'defaultBucket' => 'my-bucket',
            'defaultAcl' => 'public-read',
        ],
        // ...
    ],

基本用法

命令工厂和附加参数的用法

/** @var \agielks\yii2\aws\s3\Service $s3 */
$s3 = Yii::$app->get('s3');

/** @var \Aws\ResultInterface $result */
$result = $s3->commands()->get('filename.ext')->saveAs('/path/to/local/file.ext')->execute();

$result = $s3->commands()->put('filename.ext', 'body')->withContentType('text/plain')->execute();

$result = $s3->commands()->delete('filename.ext')->execute();

$result = $s3->commands()->upload('filename.ext', '/path/to/local/file.ext')->withAcl('private')->execute();

$result = $s3->commands()->restore('filename.ext', $days = 7)->execute();

$result = $s3->commands()->list('path/')->execute();

/** @var bool $exist */
$exist = $s3->commands()->exist('filename.ext')->execute();

/** @var string $url */
$url = $s3->commands()->getUrl('filename.ext')->execute();

/** @var string $signedUrl */
$signedUrl = $s3->commands()->getPresignedUrl('filename.ext', '+2 days')->execute();

简短语法

/** @var \agielks\yii2\aws\s3\Service $s3 */
$s3 = Yii::$app->get('s3');

/** @var \Aws\ResultInterface $result */
$result = $s3->get('filename.ext');

$result = $s3->put('filename.ext', 'body');

$result = $s3->delete('filename.ext');

$result = $s3->upload('filename.ext', '/path/to/local/file.ext');

$result = $s3->restore('filename.ext', $days = 7);

$result = $s3->list('path/');

/** @var bool $exist */
$exist = $s3->exist('filename.ext');

/** @var string $url */
$url = $s3->getUrl('filename.ext');

/** @var string $signedUrl */
$signedUrl = $s3->getPresignedUrl('filename.ext', '+2 days');

异步执行

/** @var \agielks\yii2\aws\s3\Service $s3 */
$s3 = Yii::$app->get('s3');

/** @var \GuzzleHttp\Promise\PromiseInterface $promise */
$promise = $s3->commands()->get('filename.ext')->async()->execute();

$promise = $s3->commands()->put('filename.ext', 'body')->async()->execute();

$promise = $s3->commands()->delete('filename.ext')->async()->execute();

$promise = $s3->commands()->upload('filename.ext', 'source')->async()->execute();

$promise = $s3->commands()->list('path/')->async()->execute();

高级用法

/** @var \agielks\yii2\aws\s3\interfaces\Service $s3 */
$s3 = Yii::$app->get('s3');

/** @var \agielks\yii2\aws\s3\commands\GetCommand $command */
$command = $s3->create(GetCommand::class);
$command->inBucket('my-another-bucket')->byFilename('filename.ext')->saveAs('/path/to/local/file.ext');

/** @var \Aws\ResultInterface $result */
$result = $s3->execute($command);

// or async
/** @var \GuzzleHttp\Promise\PromiseInterface $promise */
$promise = $s3->execute($command->async());

自定义命令

命令有两种类型:由 PlainCommandHandler 处理的纯命令,以及具有自己的处理器的命令。纯命令包装了原生 AWS S3 命令。

纯命令必须实现 PlainCommand 接口,其余必须实现 Command 接口。如果命令没有实现 PlainCommand 接口,则必须有自己的处理器。

每个处理器都必须扩展 Handler 类或实现 Handler 接口。处理器在其构造函数中获得 S3Client 实例。

实现 HasBucketHasAcl 接口允许命令构建器默认设置桶和 acl 的值。

要使纯命令异步,必须实现 Asynchronous 接口。此外,您还可以使用 Async trait 来实现此接口。

考虑以下命令

<?php

namespace app\components\s3\commands;

use agielks\yii2\aws\s3\base\commands\traits\Options;
use agielks\yii2\aws\s3\interfaces\commands\Command;
use agielks\yii2\aws\s3\interfaces\commands\HasBucket;

class MyCommand implements Command, HasBucket
{
    use Options;

    protected $bucket;

    protected $something;

    public function getBucket()
    {
        return $this->bucket;
    }

    public function inBucket(string $bucket)
    {
        $this->bucket = $bucket;

        return $this;
    }

    public function getSomething()
    {
        return $this->something;
    }

    public function withSomething(string $something)
    {
        $this->something = $something;

        return $this;
    }
}

此命令的处理程序看起来像这样

<?php

namespace app\components\s3\handlers;

use app\components\s3\commands\MyCommand;
use agielks\yii2\aws\s3\base\handlers\Handler;

class MyCommandHandler extends Handler
{
    public function handle(MyCommand $command)
    {
        return $this->s3Client->someAction(
            $command->getBucket(),
            $command->getSomething(),
            $command->getOptions()
        );
    }
}

使用此命令

/** @var \agielks\yii2\aws\s3\interfaces\Service */
$s3 = Yii::$app->get('s3');

/** @var \app\components\s3\commands\MyCommand $command */
$command = $s3->create(MyCommand::class);
$command->withSomething('some value')->withOption('OptionName', 'value');

/** @var \Aws\ResultInterface $result */
$result = $s3->execute($command);

自定义纯命令看起来像这样

<?php

namespace app\components\s3\commands;

use agielks\yii2\aws\s3\interfaces\commands\HasBucket;
use agielks\yii2\aws\s3\interfaces\commands\PlainCommand;

class MyPlainCommand implements PlainCommand, HasBucket
{
    protected $args = [];

    public function getBucket()
    {
        return $this->args['Bucket'] ?? '';
    }

    public function inBucket(string $bucket)
    {
        $this->args['Bucket'] = $bucket;

        return $this;
    }

    public function getSomething()
    {
        return $this->args['something'] ?? '';
    }

    public function withSomething($something)
    {
        $this->args['something'] = $something;

        return $this;
    }

    public function getName(): string
    {
        return 'AwsS3CommandName';
    }

    public function toArgs(): array
    {
        return $this->args;
    }
}

任何命令都可以扩展 ExecutableCommand 类或实现 Executable 接口,这将允许立即执行此命令:$command->withSomething('some value')->execute();

许可证

Yii2 AWS S3 在 MIT 许可证下授权。

有关更多信息,请参阅 LICENSE 文件。