Laravel 5,日志模型创建,更新,删除事件

4 php laravel-5 laravel-5.1

我正在开发Laravel 5应用程序.其中我想记录模型创建,更新和删除事件与所有新的或更改(如果模型正在更新)模型字段.我想要简单的可重用解决方案,而无需编写太多代码.

pin*_*sia 10

当然,您可以创建如下所示的特征,并在要记录的所有模型中使用它.

<?php

namespace App\Traits;

use App\Activity;
use Illuminate\Database\Eloquent\Model;

/**
 * Class ModelEventLogger
 * @package App\Traits
 *
 *  Automatically Log Add, Update, Delete events of Model.
 */
trait ModelEventLogger {

    /**
     * Automatically boot with Model, and register Events handler.
     */
    protected static function bootModelEventLogger()
    {
        foreach (static::getRecordActivityEvents() as $eventName) {
            static::$eventName(function (Model $model) use ($eventName) {
                try {
                    $reflect = new \ReflectionClass($model);
                    return Activity::create([
                        'user_id'     => \Auth::user()->id,
                        'contentId'   => $model->id,
                        'contentType' => get_class($model),
                        'action'      => static::getActionName($eventName),
                        'description' => ucfirst($eventName) . " a " . $reflect->getShortName(),
                        'details'     => json_encode($model->getDirty())
                    ]);
                } catch (\Exception $e) {
                    return true;
                }
            });
        }
    }

    /**
     * Set the default events to be recorded if the $recordEvents
     * property does not exist on the model.
     *
     * @return array
     */
    protected static function getRecordActivityEvents()
    {
        if (isset(static::$recordEvents)) {
            return static::$recordEvents;
        }

        return [
            'created',
            'updated',
            'deleted',
        ];
    }

    /**
     * Return Suitable action name for Supplied Event
     *
     * @param $event
     * @return string
     */
    protected static function getActionName($event)
    {
        switch (strtolower($event)) {
            case 'created':
                return 'create';
                break;
            case 'updated':
                return 'update';
                break;
            case 'deleted':
                return 'delete';
                break;
            default:
                return 'unknown';
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在,您可以在要为其投掷事件的任何模型中使用此特征.在你的文章模型的情况下.

<?php namespace App;

use App\Traits\ModelEventLogger;
use Illuminate\Database\Eloquent\Model;

class Test extends Model {

    use ModelEventLogger;

    //Just in case you want specific events to be fired for Article model
    //uncomment following line of code

   // protected static $recordEvents = ['created'];

}
Run Code Online (Sandbox Code Playgroud)

当然,您必须使用相关列创建"活动"模型和相关表.我希望这有帮助.