Laravel Auditing позволяет вам вести историю изменений модели, просто используя трейт. Получить данные для проверки несложно, что позволяет отображать их различными способами. По сути вы можете увидеть все изменения всех полей до и после редактирования поста, что весьма удобно.

Недавно искал себе решение по отслеживанию изменений в моделях, к примеру для модерации постов хотелось бы видеть изменения в моделях, кто и что менял и принимать решения для модерации. Вот что я нашел и собираюсь протестировать:

Laravel Auditing — это пакет Laravel, цель которого — упростить отслеживание изменений модели. Документация описывает аудит Laravel следующим образом:

Этот пакет поможет вам понять изменения в ваших моделях Eloquent, предоставляя информацию о возможных несоответствиях и аномалиях, которые могут указывать на проблемы бизнеса или подозрительные действия.

Laravel Auditing позволяет вам вести историю изменений модели, просто используя трейт. Получить данные несложно, что позволяет отображать их различными способами.

Наряду с изменениями модели каждая запись аудита содержит пользовательский агент, URL-адрес аудита и IP-адрес пользователя. Одним из основных вариантов использования пакета является поиск подозрительных действий или неожиданных изменений в модели.

Отличия моделей с пакетом аудита Laravel

На мой взгляд, другим вариантом использования этого пакета может быть предоставление версий для записей, таких как сообщения в блогах или другой контент, который позволяет вам легко видеть, кто что изменил в модели. Это можно использовать для автосохранения, просмотра того, что изменилось, кто это изменил, и отмены изменений из предыдущей версии.

Допустим, у вас есть Post модель, содержащая статьи. Вот как вы добавляете аудит к сообщениям, когда они сохраняются и обновляются:

<?php 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');    }}

Хотя это и не включено в приведенный выше пример, вы также можете определить атрибуты, которые будут включены в аудит со свойством $auditIncluded = [];модели.

В примере модели Post вы можете получить различия для публикации с помощью пакета аудита Laravel:

// PostsController with route model bindinguse 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

В приведенном выше примере отображается только последняя разница, но вы можете предоставить функциональность для выбора номера версии или циклического просмотра всей истории версий. Аудиты возвращаются в виде коллекции, что позволяет выполнять операции по сбору аудитов, как и в любой другой модели. Документация содержит документацию по представлению аудита, чтобы дать вам больше идей о том, как представлять изменения аудита и метаданные.

Одно замечание: когда я начал экспериментировать с пакетом, я пытался php artisan tinker создавать аудиты. По умолчанию пакет аудита Laravel не отслеживает изменения моделей с консолей (включая tinker). Если у вас есть консольные команды или запланированные команды, вносящие изменения в модели, вы можете захотеть сохранить аудиты из консоли. Вы можете изменить это поведение, опубликовав и обновив конфиг пакета:

<?php return [    // ...    'console' => true,]

Наконец, пакет позволяет настраивать модель аудита, драйвер аудита (пакет поставляется с драйвером аудита базы данных) и настраивать преобразования аудита перед сохранением данных для аудита.

Ознакомьтесь с документацией для получения более подробной информации обо всем, что вы можете сделать с пакетом аудита Laravel. Вы также можете посмотреть исходный код на GitHub.