Package Data | |
---|---|
Maintainer Username: | seancheung |
Maintainer Contact: | theoxuanx@gmail.com (Sean Cheung) |
Package Create Date: | 2016-11-21 |
Package Last Update: | 2024-03-22 |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-11-22 03:13:19 |
Package Statistics | |
---|---|
Total Downloads: | 102,803 |
Monthly Downloads: | 1,421 |
Daily Downloads: | 64 |
Total Stars: | 161 |
Total Watchers: | 4 |
Total Forks: | 25 |
Total Open Issues: | 1 |
Eloquent model history tracking for Laravel
composer require panoscape/history
config/app.php
'providers' => [
...
Panoscape\History\HistoryServiceProvider::class,
];
config/app.php
'aliases' => [
...
'App\History' => Panoscape\History\History::class,
];
php artisan vendor:publish --provider="Panoscape\History\HistoryServiceProvider" --tag=migrations
php artisan vendor:publish --provider="Panoscape\History\HistoryServiceProvider" --tag=config
php artisan vendor:publish --provider="Panoscape\History\HistoryServiceProvider" --tag=translations
Add HasOperations
trait to user model.
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Panoscape\History\HasOperations;
class User extends Authenticatable
{
use Notifiable, SoftDeletes, HasOperations;
}
Add HasHistories
trait to the model that will be tracked.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Panoscape\History\HasHistories;
class Article extends Model
{
use HasHistories;
public function getModelLabel()
{
return $this->display_name;
}
}
Remember that you'll need to implement the abstract getModelLabel
method from the trait.
This provides the model instance's name in histories.
$model->histories();
//or dynamic property
$model->histories;
$user->operations();
//or dynamic property
$user->operations;
Both histories
and operations
return Eloquent relationships which also serve as query builders. You can add further constraints by chaining conditions:
// get the lastest 10 records
$model->histories()->orderBy('performed_at', 'desc')->take(10)
// filter by user id
$model->histories()->where('user_id', 10010)
//get the associated model
$history->model();
//get the associated user
//the user is the authorized user when the action is being performed
//it might be null if the history is performed unauthenticatedly
$history->user();
//check user existence
$history->hasUser();
//get the message
$history->message;
//get the meta(only available when it's an updating operation)
//the meta will be an array with the properties changing information
$history->meta;
//get the timestamp the action was performed at
$history->performed_at;
A sample message
Created Project my_project
A sample meta
[
['key' => 'name', 'old' => 'myName', 'new' => 'myNewName'],
['key' => 'age', 'old' => 10, 'new' => 100],
...
]
Besides the built in created/updating/deleting/restoring
events, you may store custom history record with ModelChanged
event.
use Panoscape\History\Events\ModelChanged;
...
//fire a model changed event
event(new ModelChanged($user, 'User roles updated', $user->roles()->pluck('id')->toArray()));
The ModelChanged
constructor accepts two/three arguments. The first is the associated model instance; the second is the message; the third is optional, which is the meta(array);
You may localize the model's type name.
To do that, add the language line to the models
array in the published language file, with the key being the class's base name in snake case.
Sample
//you may added your own model name language line here
'models' => [
'project' => '项目',
'component_template' => '组件模板',
]
This will translate your model history into
创建 项目 project_001
You may set whitelist and blacklist in config file. Please follow the description guide in the published config file.
getModelLabel
) has been modified, the history message will use its new attributes, which might not be what you expect.class Article extends Model
{
use HasHistories;
public function getModelLabel()
{
return $this->title;
}
}
// original title is 'my title'
// modify title
$article->title = 'new title';
$article->save();
// the updating history message
// expect: Updating Article my title
// actual: Updating Article new title
A workaround
public function getModelLabel()
{
return $this->getOriginal('title', $this->title);
}