在日常处理一些用户操作事件时,我们有时候需要记录下来,方便以后查阅,或者大数据统计。
Laravel 在模型事件中处理起来很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events
Laravel 的模型事件有两种方式,
设置dispatchesEvents属性映射事件类使用观察器来注册事件,这里介绍第二种新建模型
php artisan make:model Log
<?phpnamespace App;use IlluminateDatabaseEloquentModel;class Log extends Model{ protected $fillable = ['user_name', 'user_id', 'url', 'event', 'method', 'table', 'description'];}
创建迁移表:
php artisan make:migration create_logs_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 migrate
新建一个服务提供者统一注册所有的模型事件观察器(后面的名字可以自己起得形象一点)
php artisan make:provider ObserverLogServiceProvider
到/config/app.php中的providers数组注册(大概如图中)


在app目录下新建文件夹Observers存放模型观察器,并新建基类LogBaseServer并在构造函数构建基本属性(CLI是因为在命令行执行时不存在用户执行)


新建一个观察器继承基类LogBaseServer(User模型,方法的名字要对应文档中的事件)


到新建的服务提供者ObserverLogServiceProvider中运行


为需要的模型注册事件(我这挺多的,之后大概长这样)


然后我们触发一些事件(增删改,表的数据就有了)


多对多的关联插入不会出触发模型(比如attach方法)这时候就需要自己新建事件类来模拟(这里拿分配权限给角色粗略说一下)
1.在EventServiceProvider中的listen属性绑定好事件


2.事件PermissionRoleEvent中的注入两个参数,一个是角色,另一个是attach或者detach返回的数组


3.事件监听器PermissionRoleEventLog也继承基类LogBaseServer,这里就是根据传入的数组id遍历,然后创建日志


4.之后应用事件


更优雅的处理登录注销事件
1.在EventServiceProvider中的subscribe属性绑定好处理的类


2.事件监听类的方法


3.之后的效果就是这样了:


相关推荐:最新的五个Laravel视频教程
以上就是详解Laravel模型事件的两种方式的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/345878.html
微信扫一扫
支付宝扫一扫