پیگیری تغییرات مدل با Laravel Auditing

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 1 دقیقه
دسته بندی ها : لاراول

Laravel Auditing یک پکیج لاراولی هست که روی پیگیری (track) تغییرات در مدل تمرکز کرده. مستندات این پکیج , بدین صورت معرفیش میکنه :

"این پکیج به شما کمک میکنه تغییرات داخل مد Eloquent رو با اطلاعاتی که درباره ی ناهنجاری ها و مشکلاتش به شما میده, متوجه بشید.

Laravel Auditing به شما اجازه میده تاریخچه ای از تغییرات مدل رو با استفاده از یک صفت داشته باشید. بازیابی اطلاعاتی که track کرده بسیار سادست و میتونه از راه های مختلف نمایش داده بشه."

درطول تغییرات مدل, هر رکورد حسابرسی شامل عامل کاربری, URL و IP کاربر میشه. یکی از کاربردهای مهم این پکیج مشاهده ی تغییرات یا فعالیت های ناخواسته است که ممکنه در مدل اتفاق بیافته.

یکی دیگر از کاربردهای این پکیج نسخه بندی رکوردهاست, مثل پست های یک وبلاگ یا محتواهای دیگر که به شما اجازه میدهد تا ببینید چه کسی چه چیزی را در مدل تغییر داده. این میتونه در پلتفرم auto-save استفاده بشه و ببینه چه چیزی تغییر کرده و چه کسی این تغییر رو انجام داده و حتی میتونه این تغییر رو برگردونه.

بیایید فرض کنیم یک مدل Post دارید که مقاله ها رو نگه میداره. کد زیر نحوه ی حسابرسی و گزارش گیری از تغییرات رو نشون میده وقتی پست ها ذخیره یا آپدیت می شوند :

namespace App;

use OwenIt\Auditing\Auditable;
use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable as AuditableContract;

class Post extends Model implements AuditableContract
{
    use Auditable;

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

شما میتونید این رو با attribute ها تعریف کنید بدینصورت که با استفاده از property زیر در مدل استفاده میشه :

$auditIncluded = [];

در مثال مدل Post, شما میتونید به همین شکل برای یک پست حسابرسی ها رو دریافت کنید :

// PostsController with route model binding
use App\Post;

function show(Post $post)
{
    $diff = $post->audits()->with('user')->get()->last();

    return view('posts.show')
        ->withPost($post)
        ->withDiff($diff);
}

این هم نحوه نمایش اطلاعات در blade :

@if($diff)
    <h3>Post Changes</h3>

    <div class="author-info">
        <span class="byline">
            Revision by <strong>{{ $diff->user->name }}</strong>
        </span>
        <span class="time-ago">
            {{ \Carbon\Carbon::parse($diff->created_at)->diffForHumans() }}
        </span>
    </div>

    @foreach($diff->getModified() as $field => $value)
        <h3>{{ ucfirst($field) }}</h3>
        <table class="diff">
            <tr>
                <td style="background: #ffe9e9" class="deleted-line">{{ $value["old"] }}</td>
                <td style="background: #e9ffe9" class="added-line">{{ $value["new"] }}</td>
            </tr>
        </table>
    @endforeach
@endif

مثال بالا آخرین گزارش رو نشون میده, اما شما میتونید عملیات هایی برای انتخاب رکورد از بین تاریخچه استفاده کنید. نتیجه بصورت collection بوده و به شما اجازه میده عملیات های موجود رو روی اون انجام بدید (مثل هر مدل دیگری). مستندات این پکیج شامل توضیحات کاملی هست که به شما ایده های بیشتری میده.

نکته ای که باید دقت کنید اینه که بصورت پیشفرض Laravel Auditing تغییراتی رو که از طریق کنسول روی مدل میدید (مثل artisan tinker) حسابرسی نمیکنه. اگر شما میخواهید از طریق کامند های کنسول یا Scheduled تغییرات ایجاد کنید. بهتره با ایجاد یک تغییر کوچک در فایل کانفیگ این اجازه رو به پکیج بدید :

return [
    // ...
    'console' => true,
]

منبع

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید