Laravel 5,记录模型创建、更新、删除事件
Laravel 5, log Model create, update , delete events
我正在开发 Laravel 5 应用程序。我想在其中使用所有新的或更改的(如果正在更新模型)模型字段记录模型创建、更新和删除事件。我想要简单的可重用解决方案,而无需编写太多代码。
当然可以像下面这样创建特征并将其用于要记录的所有模型。,
<?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';
}
}
}
现在您可以在任何要为其引发事件的模型中使用此特征。在您的文章模型中。
<?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'];
}
当然,您必须创建 'Activity' 模型和具有相关列的相关 table。
希望对您有所帮助。
我做了一点修改希望对你有帮助。 (这只是跟踪模型的修改)
迁移
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateLogActions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('log_actions', function (Blueprint $table) {
$table->increments('id');
$table->integer('loggable_id');
$table->string('loggable_type');
$table->string('action');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamp('dt_action');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('log_actions');
}
}
型号
<?php
namespace App\Wdog\Entities;
use Illuminate\Database\Eloquent\Model;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;
class LogAction extends Model implements Transformable
{
use TransformableTrait;
protected $fillable = [
'loggable_type',
'loggable_id',
'user_id',
'action',
'dt_action'
];
public $timestamps = false;
protected $dates = [
'dt_action'
];
public function user()
{
return $this->belongsTo('App\User');
}
public function loggable()
{
return $this->morphTo();
}
}
特质
最后只添加一个特征
<?php
namespace App\Wdog\Traits;
use App\Wdog\Entities\LogAction;
use Auth;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
trait ModelEventLogger
{
public static function bootModelEventLogger()
{
$user_id = Auth::user()->id;
foreach (static::getRecordActivityEvents() as $eventName) {
static::$eventName(function (Model $model) use ($user_id, $eventName) {
$log = new LogAction([
'user_id' => $user_id,
'dt_action' => Carbon::now(),
'action' => $eventName
]);
$model->logs()->save($log);
});
}
}
protected static function getRecordActivityEvents()
{
if (isset(static::$recordEvents)) {
return static::$recordEvents;
}
return [
'created',
'updated',
'deleted',
];
}
protected static function logs()
{
return $this->morphMany('\App\Wdog\Entities\LogAction', 'loggable')->orderBy('dt_action', 'desc');
}
}
然后只需在您的模型中使用该特征
class User extends Model implements Transformable
{
use ModelEventLogger;
...
虽然是旧线程,但具体参考了 OP 的 simple reusable solution without writing too much of a code
请求,Spatie's activity logger is a breeze! This specific part 的完整文档显示了 OP 的任务是多么简单易行!
我正在开发 Laravel 5 应用程序。我想在其中使用所有新的或更改的(如果正在更新模型)模型字段记录模型创建、更新和删除事件。我想要简单的可重用解决方案,而无需编写太多代码。
当然可以像下面这样创建特征并将其用于要记录的所有模型。,
<?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';
}
}
}
现在您可以在任何要为其引发事件的模型中使用此特征。在您的文章模型中。
<?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'];
}
当然,您必须创建 'Activity' 模型和具有相关列的相关 table。 希望对您有所帮助。
我做了一点修改希望对你有帮助。 (这只是跟踪模型的修改)
迁移
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateLogActions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('log_actions', function (Blueprint $table) {
$table->increments('id');
$table->integer('loggable_id');
$table->string('loggable_type');
$table->string('action');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamp('dt_action');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('log_actions');
}
}
型号
<?php
namespace App\Wdog\Entities;
use Illuminate\Database\Eloquent\Model;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;
class LogAction extends Model implements Transformable
{
use TransformableTrait;
protected $fillable = [
'loggable_type',
'loggable_id',
'user_id',
'action',
'dt_action'
];
public $timestamps = false;
protected $dates = [
'dt_action'
];
public function user()
{
return $this->belongsTo('App\User');
}
public function loggable()
{
return $this->morphTo();
}
}
特质
最后只添加一个特征
<?php
namespace App\Wdog\Traits;
use App\Wdog\Entities\LogAction;
use Auth;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
trait ModelEventLogger
{
public static function bootModelEventLogger()
{
$user_id = Auth::user()->id;
foreach (static::getRecordActivityEvents() as $eventName) {
static::$eventName(function (Model $model) use ($user_id, $eventName) {
$log = new LogAction([
'user_id' => $user_id,
'dt_action' => Carbon::now(),
'action' => $eventName
]);
$model->logs()->save($log);
});
}
}
protected static function getRecordActivityEvents()
{
if (isset(static::$recordEvents)) {
return static::$recordEvents;
}
return [
'created',
'updated',
'deleted',
];
}
protected static function logs()
{
return $this->morphMany('\App\Wdog\Entities\LogAction', 'loggable')->orderBy('dt_action', 'desc');
}
}
然后只需在您的模型中使用该特征
class User extends Model implements Transformable
{
use ModelEventLogger;
...
虽然是旧线程,但具体参考了 OP 的 simple reusable solution without writing too much of a code
请求,Spatie's activity logger is a breeze! This specific part 的完整文档显示了 OP 的任务是多么简单易行!