sucohi/clamp-bolt

一个允许您将文件附加/分离到模型的 Laravel 扩展包。

5.0.3 2020-05-10 16:59 UTC

README

一个允许您将文件附加/分离到模型的 Laravel 扩展包。
(此扩展包在 L6.x 版本下维护)

安装

执行 composer 命令。

composer require sukohi/clamp-bolt:5.*

如果您的 Laravel 版本小于 5.4,请在 app.php 中注册 ClampBoltServiceProvider。

'providers' => [
    // ...Others...,  
    Sukohi\ClampBolt\ClampBoltServiceProvider::class,
]

准备

首先,执行 publish 和 migrate 命令。

php artisan vendor:publish --provider="Sukohi\ClampBolt\ClampBoltServiceProvider"
php artisan migrate

并将 ClampBoltTrait 设置到您的模型中。

use Sukohi\ClampBolt\ClampBoltTrait;

class Item extends Model
{
    use ClampBoltTrait;
}

就这么多。
现在您的模型有 2 个方法,分别叫 attach()detach()

用法

附件

(基本方法)

$item = \App\Item::find(1);
$item->attach('attachment_key', '/PATH/TO/YOUR/FILE');
$item->save();

(多种方法)

$item = \App\Item::find(1);
$item->attach('attachment_key_1', '/PATH/TO/YOUR/FILE1');
$item->attach('attachment_key_2', '/PATH/TO/YOUR/FILE2');
$item->attach('attachment_key_3', '/PATH/TO/YOUR/FILE3');
$item->save();

// or

$item->attach([
    'attachment_key_1' => '/PATH/TO/YOUR/FILE1',
    'attachment_key_2' => '/PATH/TO/YOUR/FILE2',
    'attachment_key_3' => '/PATH/TO/YOUR/FILE3'
]);

(参数)

您可以为每个附件添加参数。

$parameters = [
    'key_1' => 'value_1', 
    'key_2' => 'value_2', 
    'key_3' => 'value_3'
];
$item = \App\Item::find(1);
$item->attach('attachment_key', '/PATH/TO/YOUR/FILE', $parameters);
$item->save();

(自动保存)

如果您直接设置以下 Request 参数,ClampBolt 将自动在 storage 文件夹中保存文件。

public function upload(Request $request, Item $item) {

    $item->attach('attachment_key', $request->file('photo'));
    $item->save();

}

注意:在这种情况下,文件路径是 /storage/app/attachment_key/

如果您使用点表示法如下,所有文件都将保存在 photos 中。
我的意思是相同的文件夹。

public function upload(Request $request, Item $item) {

    $item->attach('photos.1', $request->file('photo_1'));
    $item->attach('photos.2', $request->file('photo_2'));
    $item->attach('photos.3', $request->file('photo_3'));
    $item->save();
    
    // or 
    
    $item->attach('photos.*', $path); // Refer to "Wildcard key"
    $item->save();

}

(通配符键)

您可以使用 * 来附加文件。

$item->attach('photos.*', $path);
$item->save();

在这种情况下,此扩展包将自动保存新的附件键,如 photos.0photos.1
您还可以多次附加文件。

$item->attach('photos.*', $path_1);
$item->attach('photos.*', $path_2);
$item->save();

通配符键也适用于检索和分离文件。

// Retrieve
$attachments = $item->getAttachment('photos.*');

// Detach
$item->detach('photos.*');
$user->save();

(删除旧文件)

如果您想删除旧文件,请在第 4 个参数中设置 true

$item->attach('attachment_key', '/PATH/TO/YOUR/NEW/FILE', [], true);

分离

(基本方法)

$item = \App\Item::find(1);
$item->detach('key');
$item->save();

(多种方法)

$item = \App\Item::find(1);
$item->detach('key');
$item->detach('key2');
$item->detach('key3');
$item->save();

// or

$item->detach(['key', 'key2', 'key3']);
$item->save();

(全部)

$item = \App\Item::find(1);
$item->detachAll();
$item->save();

(带删除文件)

$item->detach('key', true);
$item->save();

// or

$item->detach(['key', 'key2', 'key3'], true);
$item->save();

// or 

$item->detachAll(true);
$item->save();

检索附件

$item = \App\Item::find(1);
$attachment = $item->getAttachment($key);

echo $attachment->id;
echo $attachment->model;
echo $attachment->model_id;
echo $attachment->key;
echo $attachment->dir;
echo $attachment->filename;
echo $attachment->path;
echo $attachment->extension;
echo $attachment->mime_type;
echo $attachment->size;
echo $attachment->public_url;
echo $attachment->parameters;   // Array
echo $attachment->created_at;   // DateTime
echo $attachment->updated_at;   // DateTime

注意:如果文件存储在 /storage/public 中,则 public_url 属性可用。这意味着您需要在 Laravel 应用中创建符号链接。
请参阅这里

您也可以如下一次性获取所有附件。

$item = \App\Item::find(1);

foreach ($item->attachments as $key => $attachment) {

    // Do something..

}

(文件名)

$filenames = $item->attachment_filenames;

(路径)

$paths = $item->attachment_paths;

(公共 URL)

$public_urls = $item->attachment_public_urls;

注意

如果您使用 点表示法,如 array_key.0 作为附件键,则 attachment_filenamesattachment_pathsattachment_public_urls 属性返回多维数组。
如果它们未存储在 /storage/public 中,则 attachment_public_urls 的值将为空。
请参阅此文件中的 检索附件

检查附件是否存在

if($item->hasAttachment('attachment_key')) {

    // has it!

}

// or multiply

if($item->hasAttachment('attachment_key.*')) {

    // has it!

}

下载

在控制器或路由中调用 download()

return $attachment->download();

// or

return $attachment->download('filename.jpg');  

响应

在控制器或路由中调用 response()

return $attachment->response();  

事件

您可以调用 attacheddetached 事件。

class Item extends Model
{
    protected $dispatchesEvents = [
        'attached' => ItemAttached::class,
        'detached' => ItemDetached::class
    ];

(在您的 事件中)

class ItemAttached
{
    public function __construct(Attachment $attachment)
    {
        // Do someting..
    }

注意:构造函数的第一个参数是 $attachment 实例。不是父模型实例。

Where 条件

whereHasAttachment() 允许您检索至少有一个附件的项目。

$users = \App\User::whereHasAttachment('attachment_key')->get();

或者您可以使用通配符如下。

$users = \App\User::whereHasAttachment('attachment_key.*')->get();

验证规则

total_attachment:table,id,attachment_key,min,max,detaching_count

验证下的文件总数必须在 :min:max 之间。
此总数包括您的应用程序中已存储的文件。

'photos' => 'total_attachment:users,1,photos,1,5'

如果您在附加文件的同时分离文件,请将 detaching_count 添加到参数末尾。

'photos' => 'total_attachment:users,1,photos,1,5,3'

然后在 /resources/lang/**/validation.php 中添加错误消息。

// en
'total_attachment' => 'The total number of :attribute must be between :min and :max.'

// ja
'total_attachment' => ':attributeの全件数は、:min個から:max個にしてください。'

命令

清除附件

您可以通过运行 attachment:clear 命令删除所有附件文件并清除 attachments 表。

php artisan attachment:clear

或无需确认

php artisan attachment:clear --force

注意:文件夹不会被删除。

关系

ClampBoltTrait

您有两个名为 attachmentspublic_attachments 的关系。
第一个包含所有数据,而 public_attachments 只包含一些数据,以便您可以为像ajax数据一样的访客发布。
键如下。

  • id
  • model_id
  • key
  • filename
  • extension
  • mime_type
  • parameters
  • public_url

并且与 public_attachments 一起使用。

$user = \App\User::with('public_attachments')->find(1);

附件

$user = \App\User::find(1);

foreach($user->attachments as $attachment) {

    $parent = $attachment->parent;  // \App\User

}

缩略图

如果附件文件是图像,您可以如下生成缩略图。

$user->attach('image', $file, [], true)->thumbnail([
    '500x300',
    '300x300'
]);

在这种情况下,附件键为 image_thumbnail_500x300image_thumbnail_300x300

当然,可以使用通配符。

$user->attach('photos.*', $file, [], true)->thumbnail([
    '700x500',
    '150x150'
]);

或者附件也有 thumbnail() 方法。

$width = 500;
$height = 300;
$attachment->thumbnail($width, $height);

删除时

此包会移除与您要删除的记录对应的全部附件数据。如果您还想删除附件文件,请在第一个参数中设置 true

$item->delete(true);

设置目录

如果您想将上传的文件保存到特定的目录,请使用 setAttachmentDir()

$user->setAttachmentDir('public/nested_1/nested_2/nested_3');
$user->attach('attachment_key', $request->file('profile'));
$user->save();

在这种情况下,文件将存储在 /storage/app/public/nested_1/nested_2/nested_3/attachment_key/

许可

此包受MIT许可协议的许可。

版权所有 2016 Sukohi Kuhoh