笔记:事件系统的快速上手 | laravel china 社区-金年会app官方网
写在前面
事件系统是一个简单的观察者模式的实现,允许你能够订阅
和监听
在应用中的发生的各种事件。
事件系统可作为一个非常棒的方式来解耦你的业务,一个事件可以有多个监听者。例如:一个事件触发 一个通知
,同步关联业务
服务,推送三方
平台等
事件类目录 app/events
,监听类/订阅类目录 app/listeners
。
快速开始
事件系统主要涉及:事件、监听者、订阅者、模型observer,以下结合日常使用习惯,对其进行简单的梳理说明
名词解释
事件:应用程序中发生的特定动作或状态变化,或者是某种状态改变/某个操作的触发
监听者:对特定事件作出响应的监听类。它订阅了一个或多个事件,并在事件发生时执行预定操作
订阅者:一种特殊的监听器,通常是一组监听器的集合,定义多个处理不同事件的方法
orm observer:框架 orm模型
事件监听的快速实现,就是模型的观察者实现
注册事件
使用 artisan 命令行来创建事件和监听者
# 创建事件
php artisan make:event loginevent
# 创建监听者
php artisan make:listener loginlistener --event=loginevent
服务提供者 app\providers\eventserviceprovider
,提供了一个属性 $listen
来注册事件监听者。
要求:统一使用 $listen
属性来手动注册。对 laravel 事件系统
支持的其他注册方式不予说明。
使用属性 $listen
注册,包含事件 (键) 和监听器 (值)。
参考代码:
namespace app\providers;
use app\events\loginevent;
use app\listeners\loginlistener;
use illuminate\auth\events\registered;
use illuminate\auth\listeners\sendemailverificationnotification;
use illuminate\foundation\support\providers\eventserviceprovider as serviceprovider;
use illuminate\support\facades\event;
class eventserviceprovider extends serviceprovider
{
/**
* the event to listener mappings for the application.
*
* @var array>
*/
protected $listen = [
registered::class => [
sendemailverificationnotification::class,
],
loginevent::class => [
loginlistener::class,
],
];
/**
* the model observers to register.
* @var array
*/
protected $observers = [];
/**
* the subscribers to register.
* @var array
*/
protected $subscribe = [];
/**
* register any events for your application.
*
* @return void
*/
public function boot()
{
//
}
/**
* determine if events and listeners should be automatically discovered.
*
* @return bool
*/
public function shoulddiscoverevents()
{
return false;
}
}
注意:
- 自动发现事件和监听器必须禁用!
/**
* 确定是否应用自动发现事件和监听器。
*
* @return bool
*/
public function shoulddiscoverevents()
{
return false;
}
- 属性
$observers
用来注册模型观察者
,命令:
代码如下:# 模型 observer php artisan make:observer userobserver --model=user
/** * 应用程序的模型观察者。 * * @var array */ protected $observers = [ user::class => [userobserver::class], ];
- 属性
$subscribe
注册订阅者,就理解为监听者的批量绑定即可,同样使用artisan
命令:
不过这里需要通过php artisan make:listener loginsubscribe
subscribe()
方法进行事件监听器注册。
参考代码:
namespace app\listeners;
use app\events\loginevent;
use app\events\logoutevent;
use illuminate\contracts\queue\shouldqueue;
use illuminate\queue\interactswithqueue;
use illuminate\support\facades\log;
class loginsubscribe implements shouldqueue
{
/**
* 登录事件
*/
public function handlelogin($event)
{
log::info('handlelogin: start');
sleep(10);
log::info('phone:' . $event->phone);
log::info('handlelogin: end');
}
/**
* 退出事件
*/
public function handlelogout($event)
{
log::info('handlelogout: start');
sleep(10);
log::info('phone:' . $event->phone);
log::info('handlelogout: end');
}
public function subscribe($events)
{
return [
loginevent::class => 'handlelogin',
logoutevent::class => 'handlelogout',
];
}
}
- 使用监听器队列,只需将
shouldqueue
接口添加到监听器类即可
class loginlistener implements shouldqueue {}
class loginsubscribe implements shouldqueue {}
调度事件
事件分派/触发使用事件类的 dispatch()
方法, 传递给 dispatch()
方法的参数都将被传递给事件的构造函数,所以在事件类中注意接收!
而在监听类中,就可以使用 $event->property
访问事件的属性来获取调度事件时传递的参数!
public function test(request $request)
{
$phone = '18011223344';
loginevent::dispatch($phone);
logoutevent::dispatch($phone);
}
小结
laravel
的事件系统是开箱即用,借助其能力,可快速解耦,提高程序可维护性、可扩展性!事件
是一种介质/信号,表示系统中发生了某种情况;监听者
则是方法/措施,是对发生的某种情况的反应!监听者
和 订阅者
是对事件作出反应的组件,定义了事件发生时应该执行的逻辑。而 订阅者
其实就是监听者,或者说是监听者的补充模型observer
是监听和响应 orm模型生命周期
事件的 特殊类型的监听器
,用于处理与数据库相关的业务逻辑。
参考文档:
本作品采用《cc 协议》,转载必须注明作者和本文链接