spatie/laravel-personal-data-export

在Laravel应用程序中创建个人数据下载

4.3.0 2024-02-28 10:07 UTC

README

Latest Version on Packagist run-tests Check & fix styling Total Downloads

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

您可以通过派发CreatePersonalDataExportJob任务来创建和邮寄此类zip文件

// somewhere in your app

use Spatie\PersonalDataExport\Jobs\CreatePersonalDataExportJob;

// ...

dispatch(new CreatePersonalDataExportJob(auth()->user()));

该包将创建包含所有个人数据的zip文件。当zip文件创建完成后,将向用户邮寄包含其链接的邮件。默认情况下,zip文件保存在非公开位置,用户需要登录才能下载zip文件。

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

// in your User model

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

您可以在存档的目录中存储文件。为此,将目录路径作为第三个参数添加。

public function selectPersonalData(PersonalDataSelection $personalDataSelection): void {
    $personalDataSelection
        ->addFile(storage_path("avatars/{$this->id}.jpg"), directory: 'avatars');
}

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

支持我们

我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感激您从家乡寄给我们一张明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上

安装

您可以通过composer安装此包

composer require spatie/laravel-personal-data-export

您需要在您的路由文件中使用此宏。它将为用户下载个人数据导出注册一个路由。

// in your routes file

Route::personalDataExports('personal-data-exports');

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

// in config/filesystems.php

// ...

'disks' => [

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

// ...

要自动清理旧的个人数据导出,您可以在控制台内核中安排此命令

// app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('personal-data-export:clean')->daily();
}

可选地,您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Spatie\PersonalDataExport\PersonalDataExportServiceProvider" --tag="personal-data-export-config"

这是配置文件的内容,它将在config/personal-data-export.php中发布

return [
    /*
     * The disk where the exports will be stored by default.
     */
    'disk' => 'personal-data-exports',

    /*
     * The amount of days the exports will be available.
     */
    'delete_after_days' => 5,

    /*
     * Determines whether the user should be logged in to be able
     * to access the export.
     */
    'authentication_required' => true,

    /*
     * The notification which will be sent to the user when the export
     * has been created.
     */
    'notification' => \Spatie\PersonalDataExport\Notifications\PersonalDataExportedNotification::class,

    /*
     * Configure the queue and connection used by `CreatePersonalDataExportJob`
     * which will create the export.
     */
    'job' => [
        'queue' => null,
        'connection' => null,
    ],
];

用法

选择个人数据

首先,您必须准备您的用户模型。您的模型应该实现Spatie\PersonalDataExport\ExportsPersonalData接口。此接口看起来是这样的

namespace Spatie\PersonalDataExport;

interface ExportsPersonalData
{
    public function selectPersonalData(PersonalDataSelection $personalDataSelection): void;

    public function personalDataExportName(): string;
}

selectPersonalData用于确定个人下载的内容。以下是一个示例实现

// in your user model

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

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

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

导出的名称本身可以使用用户上的personalDataExportName来设置。这将仅影响作为响应发送给用户的下载名称,而不是存储在磁盘上的zip文件名称。

// on your user

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

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

创建导出

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

// somewhere in your app

use Spatie\PersonalDataExport\Jobs\CreatePersonalDataExportJob;

// ...

dispatch(new CreatePersonalDataExportJob(auth()->user()));

默认情况下,此作业将被排队。它将复制您在用户上的selectPersonalData中选择的全部文件和内容到一个临时目录。接下来,那个临时目录将被压缩并复制到personal-data-exports磁盘。将向用户发送一个指向该zip文件的链接。

保护导出

我们建议不要公开访问personal-data-exports磁盘。如果您使用此磁盘的local驱动,请确保使用不在您的应用程序公共路径内的路径。

当用户点击创建导出后发送的邮件中的下载链接时,将向底层的PersonalDataExportController发送请求。此控制器将检查是否有用户已登录以及请求的个人数据zip是否属于该用户。如果是这种情况,该控制器将流式传输zip文件给用户。

如果您不希望强制要求用户登录才能下载个人数据导出,可以将authentication_required配置值设置为false。将值设置为false会降低安全性,因为任何拥有zip文件链接的人都可以下载它,但由于zip文件名称包含许多随机字符,因此很难猜出它。

翻译通知

您需要发布翻译

php artisan vendor:publish --provider="Spatie\PersonalDataExport\PersonalDataExportServiceProvider" --tag="personal-data-export-translations"

自定义邮件

您可以通过创建自己的mailable,该mailable扩展自Spatie\PersonalDataExport\Notifications\PersonalDataExportedNotification,并在config/personal-data-export.phpmailable配置键中注册mailable的类名来自定义mailable本身。

以下是一个示例

use Spatie\PersonalDataExport\Notifications\PersonalDataExportedNotification as SpatiePersonalDataExportedNotification;
class PersonalDataExportedNotification extends SpatiePersonalDataExportedNotification
{
    public function via($notifiable)
    {
        return ['mail'];
    }
    public function toMail($notifiable)
    {
        $downloadUrl = route('personal-data-exports', $this->zipFilename);
        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $downloadUrl);
        }
        return (new MailMessage)
            ->subject(trans('personal-data-exports.notifications.subject'))
            ->line(trans('personal-data-exports.notifications.instructions'))
            ->action(trans('personal-data-exports.notifications.action'), $downloadUrl)
            ->line(trans('personal-data-exports.notifications.deletion_message', ['date' => $this->deletionDatetime->format('Y-m-d H:i:s')]));
    }
}

然后,在config/personal-data-export.phpmailable配置键中注册您mailable的类名

    /*
     * Something like that
     */
    'notification' => \App\Notifications\PersonalDataExportedNotification::class,

自定义队列

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

use Spatie\PersonalDataExport\Jobs\CreatePersonalDataExportJob;

class MyCustomJobClass extends CreatePersonalDataExportJob
{
    public $queue = 'my-custom-queue';
}
dispatch(new MyCustomJobClass(auth()->user()));

事件

PersonalDataSelected

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

  • $personalData:一个PersonalData实例。在您的监听器中,您可以在该对象上调用addaddFile方法来向zip添加额外内容。
  • $user:为该个人数据选择的用户。

PersonalDataExportCreated

在创建个人数据zip后,将触发此事件。它有两个公共属性

  • $zipFilename:zip文件名称。
  • $user:为该zip创建的用户。

PersonalDataExportDownloaded

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

  • $zipFilename:zip文件名称。
  • $user:为该zip创建的用户。

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

测试

您可以通过运行此命令来运行所有测试

composer test

变更日志

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

贡献

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

安全

如果您发现有关安全性的错误,请通过security@spatie.be发送邮件,而不是使用问题跟踪器。

鸣谢

许可证

麻省理工学院许可证(MIT)。请参阅许可文件获取更多信息。