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

گردآوری و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 04 بهمن 1396
دسته بندی ها : لاراول

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

منبع

مقالات پیشنهادی

آموزش کار با Laravel Tinker

لاراول شامل یک REPL قدرتمند به نام Tinker هست که توسط PsySH console قدرت گرفته است. کنسول Tinker به شما اجازه میده که با اپلیکیشن لاراول از طریق دستور...

Laravel-Excel - تبدیل کردن ساده اطلاعات مدل به اکسل

امروز من می خوام به طور خلاصه بررسی اجمالی در مورد پکیج Laravel-Excel داشته باشم . به نظرم احتیاج به این نیست که در مورد این مطلب توضیح خاصی بدم چون ش...

بازاریابی محتوا در نمایشگاه ها

بازاریابی محتوا یکی از مهم‌ترین شاخه‌های بازاریابی است که در سالیان اخیر از سوی شرکت‌ها و کسب و کارها مورد استقبال گسترده قرار گرفته است. اگرچه اهمیت...

ساخت یک ربات تلگرام با استفاده از Laravel و Botman

امروز، چیز متفاوتی برای شما داریم، امروز رباتی برای دوست داران حیوانات خانگی برای شما خواهیم ساخت. بله، درست خواندید. یک ربات تلگرام برای دوستداران سگ...