it-devgroup/laravel-entity-file-table

2.1.0 2023-08-08 08:29 UTC

This package is auto-updated.

Last update: 2024-09-08 10:37:05 UTC


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);