royalcms/data-export

Royalcms 数据导出包。

v5.0.0 2019-09-04 05:58 UTC

This package is auto-updated.

Last update: 2024-09-05 16:46:14 UTC


README

此包使您能够轻松让用户下载包含所有个人数据的导出文件。此导出文件由包含所有用户属性和相关信息的 zip 文件组成。

您可以通过调度 CreateCustomizeDataExportJob 作业来创建和发送此类 zip 文件

// somewhere in your app

use Royalcms\Component\DataExport\Jobs\CreateCustomizeDataExportJob;

// ...

dispatch(new CreateCustomizeDataExportJob(userModel());

该包将创建一个包含所有自定义数据的 zip 文件。当 zip 文件创建完成后,将链接发送给用户。默认情况下,zip 文件保存在非公开位置,用户必须登录才能下载 zip 文件。

您可以在 model 上的 selectCustomizeData 方法中配置要导出的数据。

// in your User model

public function selectCustomizeData(CustomizeDataSelection $customizeDataSelection) {
    $customizeDataSelection
        ->add('user.json', ['name' => $this->name, 'email' => $this->email])
        ->addFile(storage_path("avatars/{$this->id}.jpg");
        ->addFile('other-user-data.xml', 's3');
}

此包还提供 artisan 命令来删除旧 zip 文件。

您必须将名为 data-exports 的磁盘添加到 config/filesystems。您可以使用任何您想要的驱动程序。我们建议您的磁盘不公开访问。如果您使用的是 local 驱动程序,请确保您使用的路径不在应用程序的公开路径中。

// in config/filesystems.php

// ...

'disks' => [

    'data-exports' => [
        'driver' => 'local',
        'root' => storage_path('app/data-exports'),
    ],

// ...

用法

选择自定义数据

首先,您需要准备您的用户模型。您应该让您的模型实现 Royalcms\Component\DataExport\ExportsCustomizeData 接口。该接口看起来如下

namespace Royalcms\Component\DataExport\Contracts;

interface ExportsCustomizeData
{
    public function selectCustomizeData(CustomizeDataSelection $customizeDataSelection);

    public function customizeDataExportName();
    
    public function getKey();
}

selectCustomizeData 用于确定自定义下载的内容。以下是一个示例实现

// in your user model

public function selectCustomizeData(CustomizeDataSelection $customizeDataSelection) {
    $customizeDataSelection
        ->add('user.json', ['name' => $this->name, 'email' => $this->email])
        ->addFile(storage_path("avatars/{$this->id}.jpg");
        ->addFile('other-user-data.xml', 's3');
}

$customizeDataSelection 用于确定用户可以下载的 zip 文件的内容。您可以在它上面调用这些方法

  • add:第一个参数是 zip 文件内部文件的名称。第二个参数是该文件应包含的内容。如果您在这里传递一个数组,我们将将其编码为 JSON。
  • addFile:第一个参数是文件的路径,该文件将被复制到 zip 文件中。您还可以作为第二个参数添加一个磁盘名称。

您可以使用用户上的 customizeDataExportName 设置导出本身的名称。这将仅影响发送给用户的下载的名称,而不是磁盘上存储的 zip 的名称。

// on your user

public function customizeDataExportName(string $realFilename) {
    $userName = Str::slug($this->name);

    return "export-data-{$userName}.zip";
}

创建导出

您可以通过在应用程序中的某个位置执行此作业来创建个人数据导出

// somewhere in your app

use Royalcms\Component\DataExport\Jobs\CreateCustomizeDataExportJob;

// ...

dispatch(new CreateCustomizeDataExportJob(userModel());

默认情况下,此作业是队列中的。它将复制您在用户上的 selectCustomizeData 中选择的全部文件和内容到临时目录。然后,将此临时目录 zipped 并复制到 data-exports 磁盘。将发送一个链接到该 zip 文件给用户。

保护导出

我们建议 data-exports 磁盘不可公开访问。如果您使用的是该磁盘的 local 驱动程序,请确保您使用的路径不在应用程序的公开路径中。

自定义队列

您可以通过扩展 Royalcms\Component\DataExport\Jobs\CreateCustomizeDataExportJob 并调度您自己的自定义作业类来自定义创建 zip 文件和发送邮件的作业。

use Royalcms\Component\DataExport\Jobs\CreateCustomizeDataExportJob;

class MyCustomJobClass extends CreateCustomizeDataExportJob
{
    public $queue = 'my-custom-queue`
}
dispatch(new MyCustomJobClass(userModel()));

事件

CustomizeDataSelected

在个人数据被选中后,将触发此事件。它有两个公共属性

  • $customizeData:一个 CustomizeData 的实例。在您的监听器中,您可以调用此对象的 addaddFile 方法来添加额外的内容到 zip。
  • $data:为选择此个人数据的数据。

自定义数据导出创建

此事件将在个人数据压缩文件创建后触发。它有两个公开属性

  • $zipFilename:压缩文件的名称。
  • $data:为创建此压缩文件所使用的数据。

自定义数据导出下载

此事件将在导出下载后触发。它有两个公开属性

  • $zipFilename:压缩文件的名称。
  • $data:为创建此压缩文件所使用的数据。

您可以使用此事件立即清理下载的压缩文件。