sucohi / clamp-bolt
一个允许您将文件附加/分离到模型的 Laravel 扩展包。
Requires
- illuminate/support: ^5.7|^6.0|^7.0
- intervention/image: 2.*
- dev-master
- 5.0.x-dev
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.2.x-dev
- 4.2.1
- 4.2.0
- 4.1.x-dev
- 4.1.9
- 4.1.8
- 4.1.7
- 4.1.6
- 4.1.5
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.0.x-dev
- 4.0.10
- 4.0.9
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.0.x-dev
- 3.0.11
- 3.0.10
- 3.0.9
- 3.0.8
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.0.x-dev
- 2.0.0
- 1.0.x-dev
- 1.0.2
- 1.0.1
- 1.0.0
This package is auto-updated.
Last update: 2024-09-11 02:27:08 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.0
或 photos.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_filenames
、attachment_paths
和 attachment_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();
事件
您可以调用 attached
和 detached
事件。
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
您有两个名为 attachments
和 public_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_500x300
和 image_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