Skip to content

导入导出

导出导入功能在后台管理中是非常常见的,所以在 v0.0.2 版本开始,专业版本支持后台导入导出的功能。Excel 是基于 Laravel Excel 进行封装,便于用户使用,只需要几行代码便可以实现导入和导出。 首先我们先来看看导出。

导出

CatchAdmin 核心提供了一个抽象基础类,通过基础它,可以快捷实现导出,下面是一个用户导出的案例

php
namespace Modules\User\Export;

// 该类就是基础核心类,通过集成它可以快速实现导出
use Catch\Support\Excel\Export;

class User extends Export
{
    // 这里需要设置导出的头信息
    protected array $header = [
        'id', '昵称', '邮箱', '创建时间'
    ];

    // 实现 array 方法,返回导出的数据
    public function array(): array
    {
        // TODO: Implement array() method.
        return \Modules\User\Models\User::query()
            ->select('id', 'username', 'email', 'created_at')
            ->without('roles')
            ->get([
                'id', 'username', 'email', 'created_at'
            ])->toArray();
    }
}

只需要轻松的几行代码,便可实现导出 Excel。这只是实现了导出类,那么如何使用呢? 也很简单,例如在 UserController 添加 export 方法,注入导出类

php
public function export(\Modules\User\Export\User $export)
{
    return $export->download();
}

直接通过 download 方法实现 excel 的下载。这个看起来似乎还比较繁琐,每次都要写一个导出类。一般平时导出的需求没有这么复杂,那么有没有更加简便的方法?答案是有的。看下面的例子

php
public function export()
{
    return User::query()
        ->select('id', 'username', 'email', 'created_at')
        ->without('roles')
        ->get()
        ->download(['id', '昵称', '邮箱', '创建时间']);
}

CatchAdmin 通过扩展 Collection 添加了 download 方法,这样就可以轻松实现无需编写导出类而实现导出 excel 的功能。

这个看起来似乎非常的不错,但是还不够好。如果你遇到非常耗时的任务该怎么办?你的 excel 导出几万条数据,并且里面有大量的计算查询,该怎么办呢?有人说,可以用 Laravel 的 queue 啊?但是你可以观察到 任务的耗时吗?状态呢?也没法集中管理。所以,在 CatchAdmin 中增加异步任务管理,还是上面的例子,将它变为异步任务

php
<?php
namespace Modules\User\Export;

// 首先这里需要继承 AsyncTaskInterface 接口
use Catch\Contracts\AsyncTaskInterface;
use Catch\Support\Excel\Export;

// 然后引入 AsyncTaskInterface
use Modules\System\Support\Traits\AsyncTaskDispatch;

class User extends Export implements AsyncTaskInterface
{
    // 这里 use 它,这样任务就可以变成异步的了
    use AsyncTaskDispatch;

    protected array $header = [
        'id', '昵称', '邮箱', '创建时间'
    ];

    public function array(): array
    {
        // TODO: Implement array() method.
        return \Modules\User\Models\User::query()
            ->select('id', 'username', 'email', 'created_at')
            ->without('roles')
            ->get([
                'id', 'username', 'email', 'created_at'
            ])->toArray();
    }
}

好了,任务搞好了,再来看看控制器如何写

php
/**
 * @return void
 */
public function export(\Modules\User\Export\User $export)
{
    // 控制器就更加简单了,直接 push 推送即可
    return $export->push();
}

这样任务就变成了异步任务。既然是异步任务,那么肯定需要执行。找到 app/Console/Kernel.php, 添加下面的任务即可

php
protected function schedule(Schedule $schedule): void
{
    $schedule->command('async:task')->everyMinute();
}

任务的情况和具体信息,都可以在后台管理中的系统管理/异步任务列表中进行查看