笔记:事件系统的快速上手
写在前面
事件系统是一个简单的观察者模式的实现,允许你能够订阅和监听在应用中的发生的各种事件。
事件系统可作为一个非常棒的方式来解耦你的业务,一个事件可以有多个监听者。例如:一个事件触发 一个通知,同步关联业务服务,推送三方平台等
事件类目录 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 LoginSubscribesubscribe()方法进行事件监听器注册。
参考代码:
<?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 协议》,转载必须注明作者和本文链接
关于 LearnKu