johannesschobel/laravel-userhistory

提供记录用户每次操作的可能性。

dev-master 2021-02-11 09:20 UTC

This package is not auto-updated.

Last update: 2024-09-20 02:04:27 UTC


README

Laravel Userhistory 是一个包,允许您记录用户在模型上执行的活动。

安装

通过 Composer

$ composer require johannesschobel/laravel-userhistory

入门

通过 composer(见上方)安装此包,或者在您的 composer.json 文件中直接使用

"require" : {
   ...,
   "johannesschobel/laravel-userhistory" : "dev-master",
   ...
},

将新包添加到您的 config/app.php 文件中的 providers

'providers' => [
   ...
   JohannesSchobel\UserHistory\UserHistoryServiceProvider::class,
   ...
],

然后,使用 publish 命令将所需的文件添加到您的项目中

$ php artisan vendor:publish --provider="JohannesSchobel\UserHistory\UserHistoryServiceProvider"

使用以下命令迁移数据库

$ php artisan migrate

然后开始自定义 config/userhistory.php 文件。

配置项 userhistory.models.user 因此引用了您的主体模型。如果您依赖 Laravel 框架,则已正确配置。配置项 userhistory.models.userhistory,然而,引用了 Userhistory 模型。如果您使用此包提供的模型,则一切正常。

userhistory.actions 引用一个类,提供您想要跟踪的操作。此包已预装了一些默认操作(例如 SHOWSTOREDELETE 等)。但是,您可以简单地创建自己的类文件来添加自己的特定操作

use JohannesSchobel\UserHistory\Enums\UserHistoryEnum;
class UserHistoryActions extends UserHistoryEnum {
   
   const CREATE = 100;
   const UPDATE = 101;
   const DELETE = 102;
   
   const PROFILE_CHANGED = 110;
   const PROFILE_PASSWORD_CHANGED = 111;
   
   // and so on.. 
}

最后,将此包中定义的 UserHistoryTrait 添加到您的 User 模型中,添加以下行

use UserHistoryTrait;

使用

要记录用户操作,只需做类似这样的事情

// assume, that $user is the current user
// e.g., $user = Auth::user();

// also assume, that $object is an object to be saved to the database
$object->name = "foo";
$object->description = "bar";
$result = $object->save();

if($result) {
   // create a log entry indicating that the user has updated a given record
   $history = $user->logAction($object, UserHistoryActions::UPDATE);
}

// continue with your business logic

要返回给定用户的所有 Userhistory 对象,只需调用

// assume, that $user is the current user
// e.g., $user = Auth::user();
$userhistories = $user->userhistories;
foreach($userhistories as $userhistory) {
	$obj = $userhistory->getEntity();
	// object is now null (if the entity does not exist)
	// or it is an object of the given model class!
}

更复杂示例

您可以轻松创建某种类型的 时间线,提供有关用户执行的所有操作的详细信息。在此示例中,我们将使用 League/Fractal,它提供 Transformers。此外,使用 Laravel 框架。

首先,我们创建一个 UserHistoryTransformer,可能如下所示

class UserHistoryTransformer extends TransformerAbstract
{
    public function transform(Userhistory $history)
    {
        $entity = $history->getEntity();
        
        return [
            'id' 	    => $history->id,
            'text'      => Lang::get('useractivities.' . strtolower($history->action), [], app()->getLocale()),
            'name'      => $entity->title,

            'uri'       => $entity->getSelfURI(),

            'created_at' => $history->created_at,
        ];
    }
}

接下来,我们将定义相应的端点,这将允许我们检索所有所需的信息。在 Laravel 的路由文件中创建端点 GET /my/activities

最后,将相应的控制器方法和转换器连接起来。这可能看起来像这样

class MyController extends Controller {
    // more methods here
    
    public function myActivities(Request $request) {
        $user = // authenticate the current user from the request (e.g., by using JWT)

        $histories = $user->userhistories;

        return $this->response()->collection($histories, new UserHistoryTransformer());
    }
}

变更日志

请参阅 CHANGELOG 了解最近更改了什么。

安全

如果您发现任何与安全相关的问题,请通过 :author_email 发送电子邮件,而不是使用问题跟踪器。

致谢

许可

MIT 许可证(MIT)。有关更多信息,请参阅 许可文件