spinen/ laravel-garbage-man
按配置间隔自动清理Laravel的软删除记录的计划任务。
Requires
- php: >=8.1
- illuminate/console: ~9|~10
- illuminate/database: ~9|~10
- illuminate/support: ~9|~10
- nesbot/carbon: ^2.62.1
- psr/log: ^1.0
Requires (Dev)
- laravel/pint: ^1.6
- mockery/mockery: ^1.5.1
- phpunit/phpunit: ^9.5.8
- psy/psysh: ^0.11.1
- symfony/var-dumper: ^6.2
README
Laravel中的软删除功能非常好,可以确保某些删除数据可以恢复。此包允许您配置一个数组,指定您希望软删除数据在数据库中保留的天数。
构建状态
分支 | 状态 | 覆盖率 | 代码质量 |
---|---|---|---|
开发 | |||
主分支 |
先决条件
注意:如果您需要使用 < PHP 7.2,请保持1.x版本
除了Laravel >= 5.1.10(5.1.10是第一个包含warn方法的版本,因此这是日志记录的最低版本)之外,还需要1个包。
安装
安装Garbage Man
$ composer require spinen/laravel-garbage-man
对于 >= Laravel 5.5,安装已完成
该包使用Laravel 5的自动注册功能。
从1.x升级到2.x
截至Laravel 5.8(在5.4中已弃用),分发器合约上的fire()
方法已被移除,改为使用dispatch()
。因此,我们已经更新了我们的代码以使用dispatch()
。您需要在config/garbageman.php
文件中将fire()
更改为dispatch()
。
使用命令
该命令已注册为laravel的garbageman:purge
。您可以通过以下两种方式之一运行它...
- 从命令行
php artisan garbageman:purge;
- 通过计划任务。
要自动将脚本作为计划任务运行,请将以下内容添加到App\Console\Kernel.php
的schedule方法中
$schedule->command('garbageman:purge') ->daily();
您可以使用任何需要的计划来保持记录被清理。只需查看https://laravel.net.cn/docs/master/scheduling#schedule-frequency-options中的列表。
您还可以使用任务调度器的任何高级配置选项,如“任务输出”或“任务挂钩”,如Laravel文档中列出。
配置
将包配置文件发布到config/garbageman.php
$ php artisan vendor:publish
该文件已完全文档化。您需要更改该文件以满足您的需求。有三个主要配置项...
- 分发清理事件 - 在清理每个记录时分发事件。
- 日志级别 - 记录的级别。
- 计划 - 模型及允许软删除记录保留的天数。
分发清理事件(dispatch_purge_events)
您可以通过在删除每个记录之前和之后抛出事件来挂钩每个记录的清理。有两个事件被抛出
- garbageman.purging:<full/model/name>
- garbageman.purged:<full/model/name>
模型在每个事件中传递。在实际上删除之前抛出“purging”事件,在实际上删除之后抛出“purged”事件。
请注意:这是一个昂贵的操作,因为它需要为每条记录执行一个SQL命令来删除,以便将记录与事件一起删除。因此,除非您需要捕获事件以执行其他操作,否则请保持此选项为false,以允许单个SQL调用删除每个模型的所有记录。
日志级别(logging_level)
日志消息生成的级别,将在控制台输出和日志中显示信息。
级别 | 描述 |
---|---|
0 | 紧急:系统不可用 |
1 | 警报:必须立即采取行动 |
2 | 关键:关键条件 |
3 | 错误:错误条件 |
4 | 警告:警告条件 |
5 | 通知:正常但重要的条件 |
6(默认值) | 信息:信息性消息 |
7 | 调试:调试 - 级别消息 |
控制台和日志都有一个键。这里是一个例子...
'logging_level' => [ 'console' => 3, 'log' => 6, ],
或者,您可以使用环境变量 GARBAGEMAN_CONSOLE_LOG_LEVEL
和 GARBAGEMAN_LOG_LEVEL
来设置级别。
计划(schedule)
每个模型的时间长度以天为单位。这里是一个例子...
'schedule' => [ App\ModelOne::class => 14, App\ModelTwo::class => 30, ],
这将删除任何14天前被删除的ModelOnes以及任何30天前被删除的ModelTwos。