笔记:事件系统的快速上手
写在前面
事件系统是一个简单的观察者模式的实现,允许你能够订阅
和监听
在应用中的发生的各种事件。
事件系统可作为一个非常棒的方式来解耦你的业务,一个事件可以有多个监听者。例如:一个事件触发 一个通知
,同步关联业务
服务,推送三方
平台等
事件类目录 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
注册,包含事件 (键) 和监听器 (值)。
参考代码:
<?php
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<class-string, array<int, class-string>>
*/
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()
方法进行事件监听器注册。
参考代码:
<?php
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模型生命周期
事件的 特殊类型的监听器
,用于处理与数据库相关的业务逻辑。
参考文档:事件系统《Laravel 9 中文文档》
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: