tricksunga/revisionable

此包已被废弃,不再维护。未建议替代包。

轻松处理数据库版本。

v1.0.8 2015-05-29 08:21 UTC

README

Code quality Latest Stable Version Downloads

轻松处理数据库版本。

  • 批量处理版本 - 一个条目涵盖所有创建/更新的字段,这使得比较两个给定版本或获取单个操作期间更改的所有数据变得非常容易。

需求

  • 此包需要PHP 5.4+
  • 目前它与Laravel5 +通用Illuminate Guard,tymon/jwt-auth或cartalyst/sentry 2/sentinel 2配合工作

使用(Laravel5基本示例 - 也可以查看下面的自定义设置)

1. 下载包或将其添加到您的composer.json

    "require": {
        ...
        "sofa/revisionable": "~1.0@dev",
        ...
    },

2. 将服务提供者添加到您的app/config/app.php

    'providers' => array(

        ...

        'Sofa\Revisionable\Laravel\ServiceProvider',
    ),

3. 发布包配置文件

~$ php artisan vendor:publish [--provider="Sofa\Revisionable\Laravel\ServiceProvider"]

这将创建config/sofa_revisionable.php文件,您可以在其中调整一些设置

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | User provider (auth) implementation.
    |--------------------------------------------------------------------------
    |
    | By default Laravel generic Illuminate\Auth\Guard.
    |
    | Supported options:
    |  - illuminate
    |  - sentry
    |  - sentinel
    |  - jwt-auth
    */
    'userprovider' => 'illuminate',


    /*
    |--------------------------------------------------------------------------
    | User field to be saved as the author of tracked action.
    |--------------------------------------------------------------------------
    |
    | By default:
    |
    |  - id for illuminate
    |  - login field (email) for sentry/sentinel
    |  - id or ANY field in User model for tymon/jwt-auth
    */
    'userfield'    => null,


    /*
    |--------------------------------------------------------------------------
    | Table used for the revisions.
    |--------------------------------------------------------------------------
    */
    'table'        => 'revisions',


    /*
    |--------------------------------------------------------------------------
    | Set timezone
    |--------------------------------------------------------------------------
    */
    'timezone'     => 'Asia/Manila',


    /*
    |--------------------------------------------------------------------------
    | Set date time format
    |--------------------------------------------------------------------------
    */
    'datetime_format'     => 'Y-m-d H:i:s',

];

4. 运行迁移以创建版本表

~$ php artisan migrate [--database=custom_connection]

如果您想使用非默认数据库连接运行迁移,可以提供额外的--database参数。

5. 将可修订特性和合约添加到您想要跟踪的模型中

<?php namespace App;

use Sofa\Revisionable\Laravel\RevisionableTrait; // trait
use Sofa\Revisionable\Revisionable; // interface

class User extends \Eloquent implements Revisionable {

    use RevisionableTrait;

    /*
     * Set revisionable whitelist - only changes to any
     * of these fields will be tracked during updates.
     */
    protected $revisionable = [
        'email',
        'name',
    ];

这样就可以开始使用了!

L5中的自定义

默认行为:

namespace App\Models;

use Sofa\Revisionable\Revisionable;
use Sofa\Revisionable\Laravel\RevisionableTrait;


class Ticket extends \Eloquent implements Revisionable {

    use RevisionableTrait;
}
$ php artisan tinker

>>> $ticket = App\Models\Ticket::first();
=> <App\Models\Ticket>

>>> $revision = $ticket->latestRevision;
=> <Sofa\Revisionable\Laravel\Revision>

>>> $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"

但是在这里,您可以通过捆绑的Presenter来利用它来做出有用的调整

namespace App\Models;

use Sofa\Revisionable\Revisionable;
use Sofa\Revisionable\Laravel\RevisionableTrait;


class Ticket extends \Eloquent implements Revisionable {

    use RevisionableTrait;

    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',
    ];

}

然后

$ php artisan tinker

>>> $ticket = App\Models\Ticket::first();
=> <App\Models\Ticket>

>>> $revision = $ticket->latestRevision; // automatically wrapped in presenter
=> <App\Presenters\Revisions\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"