V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DavidNineRoc
V2EX  ›  PHP

Laravel 模型事件的应用

  •  
  •   DavidNineRoc · 2018-03-18 21:41:44 +08:00 · 2592 次点击
    这是一个创建于 2443 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在日常处理一些用户操作事件时,我们有时候需要记录下来,方便以后查阅,或者大数据统计。


    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 migrate
    • 新建一个服务提供者统一注册所有的模型事件观察器(后面的名字可以自己起得形象一点) php artisan make:provider ObserverLogServiceProvider
    • /config/app.php中的providers数组注册(大概如图中)
    • app目录下新建文件夹Observers存放模型观察器,并新建基类LogBaseServer并在构造函数构建基本属性(CLI 是因为在命令行执行时不存在用户执行)
    • 新建一个观察器继承基类LogBaseServerUser模型,方法的名字要对应文档中的事件)
    • 到新建的服务提供者ObserverLogServiceProvider中运行
    • 为需要的模型注册事件(我这挺多的,之后大概长这样)
    • 然后我们触发一些事件(增删改,表的数据就有了)

    • 多对多的关联插入不会出触发模型(比如attach方法)
    • 这时候就需要自己新建事件类来模拟(这里拿分配权限给角色粗略说一下)
    1. EventServiceProvider中的listen属性绑定好事件
    2. 事件PermissionRoleEvent中的注入两个参数,一个是角色,另一个是attach或者detach返回的数组
    3. 事件监听器PermissionRoleEventLog也继承基类LogBaseServer,这里就是根据传入的数组 id 遍历,然后创建日志
    4. 之后应用事件

    • 更优雅的处理登录注销事件
    1. EventServiceProvider中的subscribe属性绑定好处理的类
    2. 事件监听类的方法
    3. 之后的效果就是这样了:

    END

    原文地址

    5 条回复    2018-03-20 16:18:49 +08:00
    dongisking
        1
    dongisking  
       2018-03-18 23:03:18 +08:00 via Android
    用手机看你的真难受啊
    crystom
        2
    crystom  
       2018-03-19 10:46:15 +08:00
    phpstudy 亮了
    DavidNineRoc
        3
    DavidNineRoc  
    OP
       2018-03-19 11:29:04 +08:00
    @dongisking 那就用电脑把~~~

    @crystom linux 上部署可以自己折腾,在 windows 我没什么追求,只要快速方便就行。何必装这个大笔,同时启动一个服务器还要打开命令行什么什么的,我直接单击,
    RorschachZZZ
        4
    RorschachZZZ  
       2018-03-19 14:25:51 +08:00
    码。我的用户行为记录一直用中间件做的。。。。
    aksoft
        5
    aksoft  
       2018-03-20 16:18:49 +08:00
    挺好,php 是世界上最好的语言
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3402 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:58 · PVG 19:58 · LAX 03:58 · JFK 06:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.