在日常处理一些用户操作事件时,我们有时候需要记录下来,方便以后查阅,或者大数据统计。
Laravel 在模型事件中处理起来很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events
Laravel 的模型事件有两种方式,
设置dispatchesEvents属性映射事件类
使用观察器来注册事件,这里介绍第二种
新建模型
php artisan make:model Log
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Log extends Model
{
protected $fillable = ['user_name', 'user_id', 'url', 'event', 'method', 'table', 'description'];
}
php artisan make:migration create_logs_table<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('logs', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('user_id')->comment('操作人的 ID');
$table->string('user_name')->comment('操作人的名字,方便直接查阅');
$table->string('url')->comment('当前操作的 URL');
$table->string('method')->comment('当前操作的请求方法');
$table->string('event')->comment('当前操作的事件,create,update,delete');
$table->string('table')->comment('操作的表');
$table->string('description')->default('');
$table->timestamps();
});
DB::statement("ALTER TABLE `logs` comment '操作日志表'");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('logs');
}
}
php artisan migratephp artisan make:provider ObserverLogServiceProvider/config/app.php中的providers数组注册(大概如图中)
app目录下新建文件夹Observers存放模型观察器,并新建基类LogBaseServer并在构造函数构建基本属性(CLI 是因为在命令行执行时不存在用户执行)
LogBaseServer(User模型,方法的名字要对应文档中的事件)
ObserverLogServiceProvider中运行
attach方法)EventServiceProvider中的listen属性绑定好事件
PermissionRoleEvent中的注入两个参数,一个是角色,另一个是attach或者detach返回的数组
PermissionRoleEventLog也继承基类LogBaseServer,这里就是根据传入的数组 id 遍历,然后创建日志
EventServiceProvider中的subscribe属性绑定好处理的类
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.