mpociot/reanimate

撤销 Laravel 软删除

1.0.0 2015-03-18 22:45 UTC

This package is auto-updated.

Last update: 2024-08-24 10:25:46 UTC


README

Reanimate

在 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分支,以便在合并到主分支之前进行测试。