mpociot / reanimate
撤销 Laravel 软删除
Requires
- php: >=5.3.0
- illuminate/database: 5.*
- illuminate/events: 5.*
- illuminate/http: 5.*
- illuminate/routing: 5.*
- illuminate/support: 5.*
Requires (Dev)
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2024-08-24 10:25:46 UTC
README
在 Laravel 中恢复模型非常简单。只需在软删除的模型上调用 restore
方法,即可完成。但如果你想在应用程序中实现简单的 撤销
机制呢?
你需要处理恢复模型、重定向回应用程序、显示成功/错误消息等问题...
如果这个过程可以简化会更好吗?
Reanimate 是一个 Laravel 扩展包,它允许你做到这一点。它简化了应用程序中软删除的撤销过程。
安装
可以通过 composer 安装 Reanimate,详细信息请参阅 packagist,此处。
要将此包添加到项目中,请将以下内容添加到项目的 composer.json 文件的 require
部分
"mpociot/reanimate": "1.*",
运行 composer update 下载包
php composer.phar update
这就完成了。查看实现指南,开始使用。
文档
Reanimate 做了什么
控制器上的简化 delete
方法可能如下所示
public function delete( User $user ) { $user->delete(); return Redirect::route( "userIndex" )->with( "message", "userDeleted" ); }
那么你该如何撤销该删除调用?你需要创建一个路由,传递对象 ID,解析对象,如果存在则恢复它,最后重定向回应用程序。
使用 Reanimate,这会变成
public function delete( User $user ) { $user->delete(); return Redirect::route( "userIndex" )->with( "message", "userDeleted" )->with( $this->undoFlash( $user ) ); }
undoFlash
将以下数据数组传递到你的会话中
"undo" => [ "route" => "userUndo", "params" => [ "DELETED_MODEL_ID" ], "lang" => "user.undo.message" ]
所以如果你的会话中有一个 undo
数组,你就知道应该为用户提供撤销删除的可能性。
只需确保撤销路由指向通过 Reanimate 特性提供的 undoDelete
方法。
然后该方法将恢复具有给定 ID 的模型,并将用户重定向到指定的索引路由。
实现与配置
你的应用程序中每个当前负责删除模型并希望从 Reanimate 中受益的控制器都需要使用 ReanimateModels
特性。
例如
namespace App\Http\Controllers; class UserController extends Controller { use \Mpociot\Reanimate\ReanimateModels; }
删除
在删除调用成功后重定向用户时,只需将 ->with( $this->undoFlash( $deletedModel ) );
数据添加到重定向中。
undoFlash 会自动为你做两件事
自动生成撤销路由
如果没有指定自定义撤销路由,Reanimate 将使用模型名称 + "Undo" 生成一个命名路由。
示例模型名称和撤销路由
User -> userUndo
Category -> categoryUndo
FileEntry -> fileEntryUndo
自动生成撤销语言键
默认情况下,可以在视图中使用 lang
键来处理撤销操作。此键是模型名称的小写表示 + .undo.message
示例模型名称和语言键
User -> user.undo.message
Category -> category.undo.message
FileEntry -> fileentry.undo.message
恢复
恢复模型的最简单方法是向 routes.php
中添加一个与生成的撤销路由名称匹配的命名路由。
此路由需要指向控制器中的 undoDelete
方法。
该方法负责使用给定的主键恢复模型,并返回重定向到自动生成的索引路由。
自动生成的模型名称
由于该方法仅接收您模型的ID,而不是模型本身,Reanimate会尝试为您猜测正确的模型名称。
这是通过使用您控制器名称的单数形式来完成的。
示例控制器名称和匹配的模型名称
UserController -> User
CategoriesController -> Category
FileEntryController -> FileEntry
自动生成的索引路由
当未指定自定义索引路由时,Reanimate会通过使用模型名称加"Index"来生成一个命名路由。
示例模型名称和撤销路由
User -> userIndex
Category -> categoryIndex
FileEntry -> fileEntryIndex
重定向还将包含一个名为message
的闪存数据,该数据包含以下之一:
在成功时包含modelname.undo.restored
或在找不到具有给定ID的模型时包含modelname.undo.invalid
。
自定义
不喜欢自动生成的路由?不喜欢自动生成的模型名称?没问题!
只需在控制器类中覆盖它们,如下所示
namespace App\Http\Controllers; class UserController extends Controller { use \Mpociot\Reanimate\ReanimateModels; protected $undoDeleteModel = 'This\Is\My\Custom\Model'; protected $indexRoute = 'home'; protected $undoRoute = 'ohNooooo'; }
如果您想要更多的控制,也可以编写自己的undoDelete
方法
namespace App\Http\Controllers; class UserController extends Controller { use \Mpociot\Reanimate\ReanimateModels; public function myCustomUndoMethod( $primaryKey ) { return $this->restoreModel( $primaryKey , new User(), "myCustomIndexRoute" ); } }
贡献
鼓励和欢迎贡献;为了保持组织有序,所有错误和要求都应在主项目的github issues标签中打开,网址为mpociot/reanimate/issues
所有拉取请求都应提交到develop
分支,以便在合并到主分支之前进行测试。