统一监听所有模型的模型事件

对于单个模型的模型事件,我们可以采用observer或者dispatchEvents的形式,如果要求在所有模型保存后,做一个相同的操作,那我们要不就需要在分散的observer里写重复的代码,要不就新建很多events,dispatch出去。有没有一个简便的方法呢?研究了下源码和论坛文章后,目前采用的下面这种方法,有什么不足或者错误,欢迎大家批评指正。

1. 新建一个订阅者

<?php

namespace App\Listeners;

use Illuminate\Support\Facades\Log;


class ModelEventSubscriber
{

    /**
     * 处理所有模型的saved事件
     */
    public function onSaved($event, $data)
    {
        Log::info($event, $data);
    }

    /**
     * 为订阅者注册监听器
     *
     * @param  \Illuminate\Events\Dispatcher  $events
     */
    public function subscribe($events)
    {
        $events->listen(
            [
                'eloquent.saved: *',
            ],
            'App\Listeners\ModelEventSubscriber@onSaved'
        );
    }
}

2. 在App/Provider/EventServiceProvider.php里加上刚创建的订阅者

    /**
     * 需要注册的订阅者类。
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\ModelEventSubscriber'    
    ];

3.运行测试,查看日志发现可以正常运行

监听所有模型的saved事件

如果要监听其他事件,在ModelEventSubscriber$subscribe里直接加就行,比如eloquent.created: *就是匹配所有模型的created事件,eloquent.created: App\Models\*就是匹配App\Models目录里面所有模型的created事件。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!