统一监听所有模型的模型事件
对于单个模型的模型事件,我们可以采用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 协议》,转载必须注明作者和本文链接
推荐文章: