adiachenko/pocket

此包已被放弃,不再维护。作者建议使用 spatie/laravel-medialibrary 包。

Laravel 的 Eloquent 文件管理系统

v1.0.1 2017-05-30 17:10 UTC

This package is auto-updated.

Last update: 2019-01-25 18:26:19 UTC


README

Eloquent😜 文件管理为 Laravel 框架。

目录

要求

  • PHP >= 7.0
  • Laravel >= 5.4
  • (可选) league/flysystem-aws-s3-v3

安装

要开始使用,请通过 Composer 包管理器安装 Pocket

composer require adiachenko/pocket

config/app.php 配置文件的 providers 数组中注册 Pocket 服务提供者

Adiachenko\Pocket\PocketServiceProvider::class,

Pocket 服务提供者将其自己的数据库迁移目录注册到框架中,因此您应该在注册提供者后迁移数据库。迁移将创建应用程序需要存储上传文件引用的表

php artisan migrate

最后,您可以发布 config/pocket.php 文件,其中您可以指定自定义文件引用模型,更改用于存储预签名 URL 的缓存连接,提供用于文件服务(如缓存控制和内容处理)等各种选项等。

php artisan vendor:publish --provider="Adiachenko\Pocket\PocketServiceProvider"

请查看它以了解可用的选项。

启用 Pocket 模型使用

Adiachenko\Pocket\Concerns\HasFiles 特性包含到您需要关联文件的 Eloquent 模型中。

<?php

namespace App;

use Adiachenko\Pocket\Concerns\HasFiles;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFiles;
}

基本用法

上传文件并将其附加到指定命名空间(在本例中为 pictures)下的模型中

/** @var Illuminate\Http\UploadedFile $file */
$model->pocket('pictures')->add($file)->asPublic();

或者,您可以省略 pocket 名称,在这种情况下将假定 default

/** @var Illuminate\Http\UploadedFile $file */
$model->pocket()->add($file)->asPublic();

您可以直接通过请求键添加文件而不是传递上传文件的实例

$model->pocket()->addFromRequest('file')->asPublic();

也可以通过 URL 上传

$model->pocket()->addFromUrl('https://some-media.com/kitten.jpg')->asPublic();

当然,文件可以以私有资产的形式上传,在这种情况下它不会直接通过 URL 访问

/** @var Illuminate\Http\UploadedFile $file */
$model->pocket()->add($file)->asPrivate();

您可以在上传时明确指定文件名

/** @var Illuminate\Http\UploadedFile $file */
$model->pocket()->add($file, 'whatever.txt')->asPublic();

或文件应上传到的磁盘(注意,我们可以使用 AWS S3 选项覆盖默认上传选项)

/** @var Illuminate\Http\UploadedFile $file */
$model->pocket()->add($file)->asPublic('s3', [
  'CacheControl' => 'max-age=604800',
  'ContentDisposition' => 'inline'
]);

您可以稍后像这样检索上传文件的引用

/** @var Illuminate\Database\Eloquent\Model $fileRef */
$fileRef = $model->pocket()->collection()->first();

指定 pocket 的所有引用都是 延迟加载 的,所以您不需要过多担心微优化您的调用。

还有一个快捷方式,会在底层为您调用 Illuminate\Database\Eloquent\Collection 实例

/** @var Illuminate\Database\Eloquent\Model $fileRef */
$fileRef = $model->pocket()->first();

对于更高级的数据库操作,如分页或排序结果,我们建议直接查询文件引用对象。

删除文件引用时,相关的文件将自动清除

/** @var Illuminate\Database\Eloquent\Model $fileRef */
$fileRef->delete();

或者您可以一次性清除整个 pocket

$model->pocket('whatever')->clear();

编辑图片

通过这个包提供的 Adiachenko\Pocket\ImageEditor 外观,您可以使用它生成图片变体(例如,缩略图或带水印的图片)。

请参阅示例

您应该在队列或计划任务中编辑图片,因为这是一种内存密集型操作。

编辑后的图片保存在与相关文件相同的 variants 目录下,可以通过 FileRef 实例上的 variants 属性访问。

当你运行 $fileRef->delete() 时,所有变体和相关数据将被自动清除,所以除非你的用例超出了此处描述的公共 API,你不需要直接管理这些。

生成公共和私有 URL

生成公共 URL 如此简单

/** @var Adiachenko\Pocket\Models\FileRef $fileRef */
$fileRef->getUrl()

URL 可以指向一个 变体,而不是原始文件

/** @var Adiachenko\Pocket\Models\FileRef $fileRef */
$fileRef->getUrl('small')

尽管我们可能在这里提供完整的文件名(例如 small.jpg),但这不是必需的,在某些情况下甚至是不推荐的(例如,可能允许同时使用 jpgjpeg 扩展名)。你只需提供足够多的字符以唯一标识变体,我们将猜测其余部分。

如果找不到变体,getUrl 辅助函数将回退到检索原始文件。

要生成私有 URL,指定分钟数作为过期时间

/** @var Adiachenko\Pocket\Models\FileRef $fileRef */
$fileRef->getUrl(5)

文件变体的方法签名将如下所示

/** @var Adiachenko\Pocket\Models\FileRef $fileRef */
$fileRef->getUrl('small', 5)

限制

虽然技术上支持任何 Flysystem 驱动器,但要从一个除 locals3 之外的驱动器提供文件,则需要实现 Adiachenko\Pocket\Channels\Channel 接口的自定义版本。其中之一,一个 channel 负责生成私有资产的预签名 URL。有关更多信息,请参阅配置文件。

如果你计划从 FTP 驱动器而不是使用第三方平台提供服务,你可能需要进一步扩展 Adiachenko\Pocket\Channels\SelfManagedChannel 类。这个类已经内置了一些功能,可以帮助你连接到用于从本地磁盘提供私有文件的现有路由。

目前必须手动重新生成图像变体。