Php Laravel 5,日志模型创建、更新、删除事件
我正在开发Laravel 5应用程序。在其中,我希望使用所有新的或更改的(如果模型正在更新)模型字段记录模型创建、更新和删除事件。我想要一个简单的可重用的解决方案,而不需要编写太多的代码。确保您可以创建下面这样的trait,并在您想要记录的所有模型中使用它Php Laravel 5,日志模型创建、更新、删除事件,php,laravel-5,laravel-5.1,Php,Laravel 5,Laravel 5.1,我正在开发Laravel 5应用程序。在其中,我希望使用所有新的或更改的(如果模型正在更新)模型字段记录模型创建、更新和删除事件。我想要一个简单的可重用的解决方案,而不需要编写太多的代码。确保您可以创建下面这样的trait,并在您想要记录的所有模型中使用它 <?php namespace App\Traits; use App\Activity; use Illuminate\Database\Eloquent\Model; /** * Class ModelEventLogger
<?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';
}
}
}
我做了一些修改,希望能有所帮助。(这只是跟踪模型上的修改)
迁移
虽然是旧线程,但具体参考OP的简单可重用解决方案的要求而不编写太多的代码
,是轻而易举的事!他们的完整文档展示了OP的任务是多么简单和容易 谢谢。我应该把这种特质放在哪里。我需要把这个放在什么地方,还是必须在什么地方注册?@Mahesh-这取决于你。您可以将此特性放在应用程序目录中的任何位置。因为它的名字间隔。事实上,从上面的代码可以明显看出,我将它放在app/Traits目录中,并带有app\Traits名称空间,您不必在任何地方注册它。它会自动启动模型,因为我在trait中的函数名前面放了boot关键字。这很好,但是我对$recordEvents变量有问题它不起作用不管我是否在模型中定义它在任何情况下它都是null@pinkal Vansia创建和更新工作正常,但删除了不起作用的模型事件。嗨pinkal,我实现了与您建议的相同的类,但它不起作用。我使用的是laravel 5.4Pretty直截了当、简单快捷,谢谢!!
<?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'];
}