Nice and easy way to handle revisions of your db.
sofa/revisionable is a Laravel package for nice and easy way to handle revisions of your db..
It currently has 256 GitHub stars and 196.820 downloads on Packagist (latest version v5.7.2).
Install it with composer require sofa/revisionable.
Discover more Laravel packages by sofa
or browse all Laravel packages to compare alternatives.
Last updated
Nice and easy way to handle revisions of your db.
composer.json:composer require sofa/revisionable
app/config/app.php: 'providers' => array(
...
'Sofa\Revisionable\Laravel\ServiceProvider',
),
~$ php artisan vendor:publish [--provider="Sofa\Revisionable\Laravel\ServiceProvider"]
this will create config/sofa_revisionable.php file, where you can adjust a few settings:
<?php
return [
/*
|--------------------------------------------------------------------------
| User model (for executor relation on Revision model).
|--------------------------------------------------------------------------
|
| By default App\User.
*/
'usermodel' => 'App\User',
/*
|--------------------------------------------------------------------------
| User provider (auth) implementation.
|--------------------------------------------------------------------------
|
| By default Laravel generic Illuminate\Auth\Guard.
|
| Supported options:
| - illuminate
| - sentry
| - sentinel
| - jwt-auth
| - session
*/
'userprovider' => 'illuminate',
/*
|--------------------------------------------------------------------------
| User field to be saved as the author of tracked action.
|--------------------------------------------------------------------------
|
| By default:
|
| - id for illuminate
| - login field (email) for sentry/sentinel
*/
'userfield' => 'id',
/*
|--------------------------------------------------------------------------
| Table used for the revisions.
|--------------------------------------------------------------------------
*/
'table' => 'revisions',
/*
|--------------------------------------------------------------------------
| Database connection used for the revisions.
|--------------------------------------------------------------------------
*/
'connection' => null,
];
~$ php artisan revisions:table
~$ php artisan revisions:upgrade-5.3
~$ php artisan migrate [--database=custom_connection]
You can provide additional --database param if you want the migration to be run using non-default db connection.
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Sofa\Revisionable\Laravel\Revisionable; // trait
class User extends Model
{
use Revisionable;
/*
* Set revisionable whitelist - only changes to any
* of these fields will be tracked during updates.
*/
protected $revisionable = [
'email',
'name',
];
And that's all to get your started!
Default behaviour:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Sofa\Revisionable\Laravel\Revisionable;
class Ticket extends Model
{
use Revisionable;
}
$ php artisan tinker
>>> $ticket = App\Models\Ticket::first();
=> <App\Models\Ticket>
>>> $revision->getDiff();
=> [
"customer_id" => [
"old" => "1",
"new" => "101"
],
"item_id" => [
"old" => "2",
"new" => "1"
],
"responsible_id" => [
"old" => "8",
"new" => "2"
]
]
>>> $revision->old('item_id');
=> "2"
>>> $revision->new('item_id');
=> "1"
>>> $revision->isUpdated('item_id');
=> true
>>> $revision->isUpdated('note');
=> false
>>> $revision->label('item_id');
=> "item_id"
>>> $revision->old;
=> [
"defect" => "nie dziala",
"note" => "wrocilo na gwarancji",
"customer_id" => "1",
"item_id" => "2",
"responsible_id" => "8",
"status_id" => "6"
]
>>> $revision->action;
=> "updated"
But here's where you can leverage bundled Presenter in order to make useful adjustments:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Sofa\Revisionable\Laravel\Revisionable;
class Ticket extends Model
{
use Revisionable;
protected $revisionPresenter = 'App\Presenters\Revisions\Ticket';
}
namespace App\Presenters\Revisions;
use Sofa\Revisionable\Laravel\Presenter;
class Ticket extends Presenter
{
protected $labels = [
'item_id' => 'Przedmiot',
'customer_id' => 'Klient',
'status_id' => 'Status',
'responsible_id' => 'Serwisant',
'defect' => 'Usterka',
'note' => 'Uwagi',
];
protected $passThrough = [
'item_id' => 'item.name',
'customer_id' => 'customer.name',
'responsible_id' => 'serviceman.name',
'status_id' => 'status.name',
];
protected $actions = [
'created' => 'utworzony',
'updated' => 'edytowany',
'deleted' => 'usunięty',
'restored' => 'przywrócony',
];
}
then
$ php artisan tinker
>>> $ticket = App\Models\Ticket::first();
=> <App\Models\Ticket>
>>> $revision->old('item_id'); // value fetched from the relationship
=> "komputer pc"
>>> $revision->new('item_id'); // value fetched from the relationship
=> "laptop acer"
>>> $revision->label('item_id'); // custom label defined in the presenter
=> "Przedmiot"
>>> $revision->action; // custom action name defined in the presenter
=> "edytowany"