it-devgroup / laravel-entity-file-table
laravel 实体文件表
Requires
- php: ^8.0
- illuminate/collections: ^9.0|^10.0
- illuminate/database: ^9.0|^10.0
- illuminate/http: ^9.0|^10.0
- illuminate/support: ^9.0|^10.0
- league/flysystem: ^3.0
- nesbot/carbon: ^2.0
README
Lumen 安装
1. 取消注释字符串
$app->withFacades();
$app->withEloquent();
在 $app->configure('app'); 之后添加
$app->configure('entity_file_table');
打开文件 bootstrap/app.php
并添加新的服务提供者
$app->register(\ItDevgroup\LaravelEntityFileTable\Providers\EntityFileTableServiceProvider::class);
2. 运行命令
创建配置文件
php artisan entity:file:table:publish --tag=config
创建迁移文件
php artisan entity:file:table:publish --tag=migration
生成表
php artisan migrate
laravel 安装
1. 打开文件 config/app.php 并搜索
'providers' => [
...
]
添加到部分
\ItDevgroup\LaravelEntityFileTable\Providers\EntityFileTableServiceProvider::class,
示例
'providers' => [
...
\ItDevgroup\LaravelEntityFileTable\Providers\EntityFileTableServiceProvider::class,
]
2. 运行命令
创建配置文件
php artisan vendor:publish --provider="ItDevgroup\LaravelEntityFileTable\Providers\EntityFileTableServiceProvider" --tag=config
创建迁移文件
php artisan entity:file:table:publish --tag=migration
生成表
php artisan migrate
环境变量
文件 .env
自动重命名所有上传文件
ENTITY_FILE_TABLE_FILENAME_GENERATE=1
所有文件的根目录
ENTITY_FILE_TABLE_DEFAULT_FOLDER=uploads
自定义模型
步骤 1
创建文件的自定义模型
示例
文件: app/CustomFile.php
内容
<?php
namespace App;
class CustomFile extends \ItDevgroup\LaravelEntityFileTable\Model\FileModel
{
}
如果需要更改表名或需要添加其他代码
<?php
namespace App;
class CustomFile extends \ItDevgroup\LaravelEntityFileTable\Model\FileModel
{
protected $table = 'YOUR_TABLE_NAME';
// other code
}
步骤 2
打开 config/entity_file_table.php 并更改参数 "model",例如
...
// remove
'model' => \ItDevgroup\LaravelEntityFileTable\Model\FileModel::class,
// add
'model' => \App\CustomFile::class,
自定义词典
创建自定义词典文件
示例
文件: resources/lang/en/entity_file_table.php
内容
<?php
return [
'delete' => 'File deletion error :path on disk :fileDriver',
'delete_message' => 'File delete/replace error',
];
添加自定义文件后,在所有地方使用 "CustomFile" 模型,而不是 "\ItDevgroup\LaravelEntityFileTable\Model\FileModel"
助手
ItDevgroup\LaravelEntityFileTable\Helpers\FileHelper
// $file - \ItDevgroup\LaravelEntityFileTable\Model\FileModel
// generate url from file
return \ItDevgroup\LaravelEntityFileTable\Helpers\FileHelper::urlFile($file);
// generate url from data
return \ItDevgroup\LaravelEntityFileTable\Helpers\FileHelper::url('file.jpg', 'public');
为自定义模型创建关系
一对一
/**
* @return Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function image()
{
return $this->morphOne(\ItDevgroup\LaravelEntityFileTable\Model\FileModel::class, 'model', 'model_type', 'model_id');
}
一对多
/**
* @return Illuminate\Database\Eloquent\Relations\MorphMany
*/
public function images()
{
return $this->morphMany(\ItDevgroup\LaravelEntityFileTable\Model\FileModel::class, 'model', 'model_type', 'model_id');
}
示例
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\MorphOne;
class User extends Model
{
...
/**
* @return MorphOne
*/
public function image()
{
return $this->morphOne(\ItDevgroup\LaravelEntityFileTable\Model\FileModel::class, 'model', 'model_type', 'model_id');
}
/**
* @return MorphMany
*/
public function images()
{
return $this->morphMany(\ItDevgroup\LaravelEntityFileTable\Model\FileModel::class, 'model', 'model_type', 'model_id');
}
}
用法
初始化服务
$service = app(\ItDevgroup\LaravelEntityFileTable\EntityFileTableServiceInterface::class);
或注入
// use
use ItDevgroup\LaravelEntityFileTable\EntityFileTableServiceInterface;
// constructor
public function __construct(
EntityFileTableServiceInterface $EntityFileTableService
)
我们将使用变量 $service
EntityFileTableServiceInterface 方法
设置是否自动重命名文件
$service->setFilenameGenerate(true);
$service->setFilenameGenerate(false);
获取文件系统中的默认磁盘(驱动器)
$driver = $service->getDriver();
获取上传文件的数据,返回 \ItDevgroup\LaravelEntityFileTable\FileData
// without additional parameters (use default folder for file)
// $uploadFile - Illuminate\Http\UploadedFile
$fileData = $service->upload($uploadFile);
// with custom folder for file
$fileData = $service->upload($uploadFile, 'test');
$fileData = $service->upload($uploadFile, 'test/folder1');
// with custom file name
$fileData = $service->upload($uploadFile, 'test', 'filename.jpg');
$fileData = $service->upload($uploadFile, null, 'filename.jpg');
从上传文件获取文件模型,返回 \ItDevgroup\LaravelEntityFileTable\Model\FileModel
// $fileData - \ItDevgroup\LaravelEntityFileTable\FileData
$file = $service->getFile($fileData);
从链接获取文件模型,返回 \ItDevgroup\LaravelEntityFileTable\Model\FileModel
// $path - url for file
$file = $service->getFileExternal($path);
保存上传文件
// save file on filesystem and database
// $file - return \ItDevgroup\LaravelEntityFileTable\Model\FileModel
$service->save($file);
$service->save($file, true);
// save file only on filesystem
$service->save($file, false);
// save file only in database
$service->saveDB($file);
通过 ID 获取文件,返回 \ItDevgroup\LaravelEntityFileTable\Model\FileModel
$file = $service->getFileById(1);
通过 ID 获取文件,返回 \ItDevgroup\LaravelEntityFileTable\Model\FileModel[] | Illuminate\Database\Eloquent\Collection
$files = $service->getFileByIds(collect([1,2,3]));
删除文件
// delete from filesystem and database
// $file - \ItDevgroup\LaravelEntityFileTable\Model\FileModel
$service->delete($file);
$service->delete($file, true);
// delete only from filesystem
$service->delete($file, false);
// delete only in database
$service->deleteDB($file);
// $file1, $file2, ... - \ItDevgroup\LaravelEntityFileTable\Model\FileModel
// $files - Collection
$files = collect([$file1, $file2, ...]);
$service->deleteAll($files);
// or
// $user - model user
$service->deleteAll($user->photos);
示例
基本保存
$uploadFile = \Illuminate\Http\UploadedFile::fake()->create('test.jpg', 10240, 'image/jpeg');
$fileData = $service->upload($uploadFile, null, 'file.jpg');
$file = $service->getFile($fileData);
$file->model()->associate(\App\User::find(1));
$service->save($file);
通过一对一关系保存(保存)
$service->setFilenameGenerate(true);
$uploadFile = \Illuminate\Http\UploadedFile::fake()->create('test.jpg', 10240, 'image/jpeg');
$fileData = $service->upload($uploadFile, null, 'file.jpg');
$file = $service->getFile($fileData);
$file->model()->associate(\App\User::find(1));
$service->save($file);
$user = \App\User::find(1);
$service->save($file, false);
$user->avatar()->save($file);
通过一对多关系保存(清除所有旧文件)
$uploadFile = \Illuminate\Http\UploadedFile::fake()->create('test.jpg', 10240, 'image/jpeg');
$fileData = $service->upload($uploadFile, null, 'file.jpg');
$file1 = $service->getFile($fileData);
$uploadFile = \Illuminate\Http\UploadedFile::fake()->create('test.jpg', 10240, 'image/jpeg');
$fileData = $service->upload($uploadFile, null, 'file.jpg');
$file2 = $service->getFile($fileData);
$user = \App\User::find(1);
$service->save($file1, false);
$service->save($file2, false);
$service->deleteAll($user->photos);
$user->photos()->saveMany([$file1,$file2]);
$user->refresh(); // if need at once show result
通过 ID 获取文件并删除
$file = $service->getFileById(1);
$service->delete($file);
返回文件的 URL(在返回到前端之前)
$file = \ItDevgroup\LaravelEntityFileTable\Model\FileModel::find(1);
return $service->generateUrl($file->path, $file->file_driver);
// or
return \ItDevgroup\LaravelEntityFileTable\Helpers\FileHelper::urlFile($file);