一、事件监听者与事件订阅者的区别
一个事件可以有多个监听器,但是每个监听器只能监听一个事件。如果想在一个类中监听多个事件,就需要使用事件订阅者。
二、事件监听
1、注册事件 和 监听器
在App\Providers\EventServiceProvider.php 中注册事件和监听器
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
'App\Events\TestEvent' => [
'App\Listeners\SmsListener',
'App\Listeners\EmailListener',
],
];
2、生成事件和监听器
php artisan event:generate
3、事件逻辑处理
// App\Events\TestEvent.php
public function __construct($model)
{
$this->model = $model;
//事件中不用进行任何逻辑处理
}
// App\Listeners\SmsListener.php
public function handle(TestEvent $event)
{
// 逻辑处理
dump("短信发送成功");
}
// App\Listeners\EmailListener.php
public function handle(TestEvent $event)
{
// 逻辑处理
dump("email邮件发送成功");
}
4、控制器中测试
public function index() {
$model = (object)[
'id' => 1,
'name' => 'wang',
'addr' => 'WuHan',
'phone' => '123456789',
'email' => 'jutkyd@qq.com'
];
dump('注册成功');
event(new TestEvent($model));
return $this->success($model);
}
三、事件订阅者
1、创建事件
php artisan make:event Test1
php artisan make:event Test2
2、创建事件订阅者
// app/Listeners/TestSubscribe.php
<?php
namespace App\Listeners;
class TestSubscribe {
/**
* 处理用户登录事件
*/
public function onUserLogin($event) {
dump("用户登录成功,发送短信");
}
/**
* 处理用户注销事件
*/
public function onUserlogout($event){
dump("用户注销成功,发送email");
}
/**
* 为订阅者注册监听器
*/
public function subscribe($events) {
$events->listen(
'App\Events\Test1',
'App\Listeners\TestSubscribe@onUserLogin'
);
$events->listen(
'App\Events\Test2',
'App\Listeners\TestSubscribe@onUserlogout'
);
}
}
3、注册事件订阅者
// App\Providers\EventServiceProvider.php
protected $subscribe = [
'App\Listeners\TestSubScribe'
];
4.创建控制器测试
public function userLogin(){
dump("用户登录成功");
event(new Test1());
}
public function userLogout(){
dump("用户注销成功");
event(new Test2());
}