统一监听所有模型的模型事件 
                                                    
                        
                    
                    
  
                    
                    对于单个模型的模型事件,我们可以采用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.运行测试,查看日志发现可以正常运行

如果要监听其他事件,在ModelEventSubscriber的$subscribe里直接加就行,比如eloquent.created: *就是匹配所有模型的created事件,eloquent.created: App\Models\*就是匹配App\Models目录里面所有模型的created事件。
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           williamQian 的个人博客
 williamQian 的个人博客
         
             
             
                     
                     
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: