stats4sd/laravel-file-util

Laravel 文件工具包

0.1.2 2021-12-01 15:25 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

安装

您可以通过 composer 安装此包

composer require stats4sd/laravel-file-util

用法

先决条件

该包具有 3 个主要功能,您可以在项目中使用其中一个或所有功能

  • 一个 trait HasUploadFields:这个 trait 严重基于 Laravel Backpack 中的 trait,但根据我们的需求进行了轻微定制。
    • 要使用该 trait,您不需要其他依赖项。
  • 2 个操作类,用于 Laravel Backpack。
    • 要使用这些操作,您应该安装以下额外依赖项
      • composer require backpack/crud
      • composer require maatwebsite/excel

1. 通过 Laravel Backpack Crud 面板导出数据

导入和导出操作都使用并需要 Laravel Excel 包。

ExportOperation 允许您将使用 Laravel Excel 构建的 ModelExport 类链接到您的 Crud 面板。

如何添加 Excel 导出

  1. 按照 这里 的描述构建您的 ModelExport 类
  • 要测试此操作类,从最基本的导出版本开始(例如,实现 FromCollection 并从您的 CRUD 模型获取一些项目。您以后可以随时添加内容来自定义导出。
<?php

namespace App\Exports;

use App\Models\Tag;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\FromCollection;

class TagsExport implements FromCollection, WithTitle, WithHeadings
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        return Tag::select(
            'id',
            'name',
            'slug',
            'files',
            'created_at',
            'updated_at',
        )->get();
    }

    /**
    * @return string
    */
    public function title(): string
    {
        return 'Tag';
    }

    public function headings(): array
    {
        return [
            'id',
            'name',
            'slug',
            'files',
            'created_at',
            'updated_at',
        ];
    }
}
  1. 在您的 CrudController 中使用您的 ModelExport 类:use App\Exports\TagsExport;

  2. 在您的 CrudController 中使用 ExportOperation:use \Stats4sd\FileUtil\Http\Controllers\Operations\ExportOperation;

  3. 在您的 CrudController 中添加以下内容:use ExportOperation;

  4. 在您的 CrudController 的 setup() 方法中添加以下内容:CRUD::set('export.exporter', YourModelExport::class);(用您的 ModelExport 类的实际名称替换)

<?php

namespace App\Http\Controllers\Admin;

use App\Exports\TagsExport;
use \Stats4sd\FileUtil\Http\Controllers\Operations\ExportOperation;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;

/**
 * Class TagCrudController
 * @package App\Http\Controllers\Admin
 * @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
 */
class TagCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
    use ExportOperation;

    /**
     * Configure the CrudPanel object. Apply settings to all operations.
     * 
     * @return void
     */
    public function setup()
    {
        CRUD::setModel(\App\Models\Tag::class);
        CRUD::setRoute(config('backpack.base.route_prefix') . '/tag');
        CRUD::setEntityNameStrings('tag', 'tags');
        CRUD::set('export.exporter', TagsExport::class);
    }

    /**
     * Define what happens when the List operation is loaded.
     * 
     * @see  https://backpackforlaravel.com/docs/crud-operation-list-entries
     * @return void
     */
    protected function setupListOperation()
    {
        CRUD::setFromDb(); // columns        
    }

    /**
     * Define what happens when the Create operation is loaded.
     * 
     * @see https://backpackforlaravel.com/docs/crud-operation-create
     * @return void
     */
    protected function setupCreateOperation()
    {
        CRUD::setFromDb(); // fields
    }

    /**
     * Define what happens when the Update operation is loaded.
     * 
     * @see https://backpackforlaravel.com/docs/crud-operation-update
     * @return void
     */
    protected function setupUpdateOperation()
    {
        $this->setupCreateOperation();
    }
}

就这样!操作在列表视图的 'top' 栈中添加了一个“导出”按钮。点击按钮,即可下载由您的 ModelExport 类生成的文件。

说明:

  • 默认文件名是 Crud 实体的 plural_name,并在末尾附加一个日期时间字符串。
  • 默认格式是 .xlsx
  • 要覆盖,请向您的 crud 控制器添加一个 export() 方法。

导出文件的所有内容都由 ModelExport 类定义。您可以使用 Laravel Excel 的任何功能来定制它,就像您在其他任何 Laravel 位置使用包一样。这个操作所做的只是使将 ModelExport 类快速链接到 Crud 面板变得更简单。

2. 通过 Laravel Backpack Crud 面板导入数据

ImportOperation 允许您将使用 Laravel Excel 构建的 ModelImport 类链接到您的 Crud 面板。

如何添加

  1. 按照 这里 的描述构建您的 ModelImport 类
<?php

namespace App\Imports;

use App\Models\Tag;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class TagsImport implements ToModel, WithHeadingRow
{
    /**
     * @param array $row
     *
     * @return Tags|null
     */
    public function model(array $row)
    {
        return new Tag([
           'name'       => $row['name'],
           'slug'       => $row['slug'],
           'files'      => $row['files'],
        ]);
    }
}
  1. 构建以下 ImportRequest 类
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Illuminate\Foundation\Http\FormRequest;

class ImportRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // only allow updates if the user is logged in
        return backpack_auth()->check();
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'importFile' => 'required|file|mimes:xls,xlsx|max:24000',
        ];
    }

    /**
     * Get the validation attributes that apply to the request.
     *
     * @return array
     */
    public function attributes()
    {
        return [
            //
        ];
    }

    /**
     * Get the validation messages that apply to the request.
     *
     * @return array
     */
    public function messages()
    {
        return [
            //
        ];
    }
}
  1. 在您的 CrudController 中使用您的 ModelImport 类:use App\Imports\TagsImport;

  2. 在您的 CrudController 中使用 ImportOperation:use \Stats4sd\FileUtil\Http\Controllers\Operations\ImportOperation;

  3. 在您的 CrudController 中添加以下内容:use ImportOperation;

  4. 在您的 CrudController 的 setup() 方法中添加以下内容:CRUD::set('import.importer', YourModelImport::class);(用您的 ModelImport 类的实际名称替换)

<?php

namespace App\Http\Controllers\Admin;

use App\Imports\TagsImport;
use \Stats4sd\FileUtil\Http\Controllers\Operations\ImportOperation;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;

/**
 * Class TagCrudController
 * @package App\Http\Controllers\Admin
 * @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
 */
class TagCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
    use ImportOperation;

    /**
     * Configure the CrudPanel object. Apply settings to all operations.
     * 
     * @return void
     */
    public function setup()
    {
        CRUD::setModel(\App\Models\Tag::class);
        CRUD::setRoute(config('backpack.base.route_prefix') . '/tag');
        CRUD::setEntityNameStrings('tag', 'tags');
        CRUD::set('import.importer', TagsImport::class);
    }

    /**
     * Define what happens when the List operation is loaded.
     * 
     * @see  https://backpackforlaravel.com/docs/crud-operation-list-entries
     * @return void
     */
    protected function setupListOperation()
    {
        CRUD::setFromDb(); // columns        
    }

    /**
     * Define what happens when the Create operation is loaded.
     * 
     * @see https://backpackforlaravel.com/docs/crud-operation-create
     * @return void
     */
    protected function setupCreateOperation()
    {
        CRUD::setFromDb(); // fields
    }

    /**
     * Define what happens when the Update operation is loaded.
     * 
     * @see https://backpackforlaravel.com/docs/crud-operation-update
     * @return void
     */
    protected function setupUpdateOperation()
    {
        $this->setupCreateOperation();
    }
}

这就完成了!这个操作在列表视图的'top'堆栈中添加了一个“导入”按钮。点击此按钮即可进入导入视图。此视图包含一个基本表单,其中包含文件上传输入和提交按钮。添加Excel文件并提交,文件将由您的ModelImport类处理。

说明:

  • 建议您为导入器添加验证。(请参阅有关验证行的文档页面)
  • 导入表单支持显示验证返回的错误。如果您使用批量导入,您将一次性看到整个行批次的错误,并标注正确的行号。这在一次查看Excel文件中的所有错误非常有用,而不是逐行查看,并需要尝试多次导入同一文件,直到没有验证错误为止。

待办事项:添加使用ToModel / BatchInserts和ToCollection关注点的验证示例

3. 文件上传 + 文件下载操作

  1. 在您的routes\web.php中使用FileController类:use \Stats4sd\FileUtil\Http\Controllers\FileController;

  2. 在您的routes\web.php中添加以下部分

Route::group([
    'middleware' => ['web']
], function () {
    Route::get('image/{path}', [FileController::class, 'getImage'])->where('path', '.*')->name('image.get');
    Route::get('download/{path}/{disk?}', [FileController::class, 'download'])->where('path', '.*')->name('file.download');
});
  1. 在config\filesystem.php中,在"disks" \ "local"部分添加一行 'url' => env('APP_URL').'/download/',

  2. 在您的Model类中使用HasUploadFields类:use \Stats4sd\FileUtil\Models\Traits\HasUploadFields;

  3. 在您的Model类中使用trait HasUploadFields: use CrudTrait, HasUploadFields;

  4. 将以下函数添加到您的Model类中,它将上传的文件保存到文件夹"storage\app\site"。文件名将存储在Model类列"files"中

    public function setFilesAttribute($value)
    {
        $attribute_name = "files";
        $disk = "local";
        $destination_path = "site";

        $this->uploadMultipleFilesWithNames($value, $attribute_name, $disk, $destination_path);
    }
  1. 将以下内容添加到您的CrudController的setupCreateOperation()方法中:CRUD::field('files')->type('upload_multiple')->disk('local')->upload(true)->label('网站文件或图表')->hint('如果您有图表或其他文件,请在此处上传');

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅我们的安全策略

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件