History of database changes with Eloquent


#1

Hello,
I use this structure for create API

I want adding a history to certain tables, to know what the users are doing.

I saw that illuminate/database has a specific package for that illuminate/events

I have managed to make the observers work, but I can not access from the user’s session to be able to register it in the table.

Model

    namespace Circe\Models;

    use Illuminate\Database\Eloquent\Model;

    class Events extends Model
    {
        protected $fillable = [
            'users_id',
            'name',
            'day_event',
            'description',
        ];

        public static function boot()
        {
            parent::boot();

            static::setEventDispatcher( new \Illuminate\Events\Dispatcher() );

            static::observe(new ReadOnlyObserver());
        }
    }

Observer

class ReadOnlyObserver {

    public function updating ($model, callable $func = null, $table = null, $id = null)
    {
        // Allow for overriding of table if it's not the model table
        $table = $table ?: $model->getTable();
        // Allow for overriding of id if it's not the model id
        $id = $id ?: $model->id;
        // Allow for customization of the history record if needed
        $func = $func ?: [$this, 'getHistoryBody'];

        var_dump($this->getUpdated($model)
            ->map(function ($value, $field) use ($func) {
                return call_user_func_array($func, [$value, $field]);
            }));
    }

    protected function getHistoryBody($value, $field)
    {
        return [
            'body' => "Updated {$field} to ${value}",
        ];
    }


    protected function getUpdated($model)
    {
        return collect($model->getDirty())->filter(function ($value, $key) {
            // We don't care if timestamps are dirty, we're not tracking those
            return !in_array($key, ['created_at', 'updated_at']);
        })->mapWithKeys(function ($value, $key) {
            // Take the field names and convert them into human readable strings for the description of the action
            // e.g. first_name -> first name
            return [str_replace('_', ' ', $key) => $value];
        });
    }

How to access the user from the ReadOnlyObserver class?

Thanks for the help.